Android Handler的使用yu应该注意的问题

 

@Override
protected void onDestroy() {
    mHandler.removeCallbacks(mRunnable);
    super.onDestroy();
}

 Android Handler的使用,在讲Handler之前,我们先提个小问题,就是如何让程序5秒钟更新一下Title.

首先我们看一下习惯了Java编程的人,在不知道Handler的用法之前是怎么样写的程序,代码如下所示:

package com.android.tutor;
 
import java.util.Timer;
import java.util.TimerTask;
import android.app.Activity;
import android.os.Bundle;
 
public class HandlerDemo extends Activity {
    // title为setTitle方法提供变量,这里为了方便我设置成了int型
    private int title = 0;
 
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
 
        Timer timer = new Timer();
        timer.scheduleAtFixedRate(new MyTask(), 1, 5000);
    }
 
    private class MyTask extends TimerTask {
        @Override
        public void run() {
 
            setTitle("Welcome to Mr Wei's blog " + title);
            title++;
        }
    }
}

 然而当我们执行程序,并不能达到我们预期的效果,所以Android引进了Handler这个特殊的类,可以说它是Runnable和Activity交互的桥梁,所以我们只要在run方法中发送Message,而在Handler里,通过不同的Message执行不同的任务。

所以我们修改后的代码如下:

package com.android.tutor;
 
import java.util.Timer;
import java.util.TimerTask;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
 
public class HandlerDemo extends Activity {
 
    // title为setTitle方法提供变量,这里为了方便我设置成了int型
    private int title = 0;
 
    private Handler mHandler = new Handler() {
 
        public void handleMessage(Message msg) {
            switch (msg.what) {
            case 1:
                updateTitle();
                break;
            }
        };
    };
 
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
 
        Timer timer = new Timer();
        timer.scheduleAtFixedRate(new MyTask(), 1, 5000);
    }
 
    private class MyTask extends TimerTask {
        @Override
        public void run() {
 
            Message message = new Message();
            message.what = 1;
            mHandler.sendMessage(message);
 
        }
    }
 
    public void updateTitle() {
 
        setTitle("Welcome to Mr Wei's blog " + title);
        title++;
    }
}

 

 

 

 

 

--------------------------------------------应该注意的问题---------------------------------------------

 

 

 

 

我们都知道Hanlder是线程与Activity通信的桥梁,我们在开发好多应用中会用到线程,有些人处理不当,会导致当程序结束时,线程并没有被销毁,而是一直在后台运行着,当我们重新启动应用时,又会重新启动一个线程,周而复始,你启动应用次数越多,开启的线程数就越多,你的机器就会变得越慢。

为了方便大家理解,我写一个简单的Demo.功能就是每2秒中将应用的Title更换一次。具体步骤如下:

第一步:新建一个Android工程命名为ThreadDemo

第二步:修改ThreadDemo.java,代码如下:

package com.tutor.thread;
 
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.util.Log;
 
public class ThreadDemo extends Activity {
    private static final String TAG = "ThreadDemo";
    private int count = 0;
    private Handler mHandler = new Handler();
 
    private Runnable mRunnable = new Runnable() {
 
        public void run() {
            // 为了方便 查看,我们用Log打印出来
            Log.e(TAG, Thread.currentThread().getName() + " " + count);
            count++;
            setTitle("" + count);
            // 每2秒执行一次
            mHandler.postDelayed(mRunnable, 2000);
        }
 
    };
 
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        // 通过Handler启动线程
        mHandler.post(mRunnable);
    }
 
}

 第三步:运行上述工程,查看运行效果:

当然上面不是重点,退出应用时,线程还在跑,打开Logcat视窗或者cmd终端查看,如下(刚吃了午餐回来,线程还在跑着):

当我们再次启动应用时,会重新启动一个新的线程,如下图所示:

 

所以我们在应用退出时,要将线程销毁,我们只要在Activity中的,onDestory()方法处理一下就OK了,如下代码所示:

 

 

 所以ThreadDemo.java的完整代码如下:

 

 

 

package com.tutor.thread;
 
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.util.Log;
 
public class ThreadDemo extends Activity {
    private static final String TAG = "ThreadDemo";
    private int count = 0;
    private Handler mHandler = new Handler();
 
    private Runnable mRunnable = new Runnable() {
 
        public void run() {
            // 为了方便 查看,我们用Log打印出来
            Log.e(TAG, Thread.currentThread().getName() + " " + count);
            count++;
            setTitle("" + count);
            // 每2秒执行一次
            mHandler.postDelayed(mRunnable, 2000);
        }
 
    };
 
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        // 通过Handler启动线程
        mHandler.post(mRunnable);
    }
 
    @Override
    protected void onDestroy() {
        // 将线程销毁掉
        mHandler.removeCallbacks(mRunnable);
        super.onDestroy();
    }
}

 

猜你喜欢

转载自zhuxinzx.iteye.com/blog/1833292