@Overrideprotected 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();    }}

更多相关文章

  1. Android中ListView下拉刷新的实现代码
  2. Android(安卓)4.0 ICS SystemUI浅析——StatusBar加载流程分析
  3. Android与H5页面的互调
  4. Android周学习Step By Step(9)--Intent之广播(完)
  5. Android周学习Step By Step(8)--Intent之启动新的Activity
  6. Android(安卓)通过 intent传值获得null
  7. mars老师的googleMap(一)
  8. Android利用ViewPager仿微信主界面-android学习之旅(78)
  9. Android每隔几秒做一个动作实现方法

随机推荐

  1. Android 快速运行的秘诀
  2. 向eclipse中导入android中的sample样例+g
  3. Android(安卓)View requires API level 1
  4. Android开发实现二级联动下拉列表
  5. android:shrinkColumns的用法 (2011-04-2
  6. android OkHttp3
  7. activity
  8. xposed框架的检测和反制
  9. Android编程简单设置ListView分割线的方
  10. AndroidStudio 开发自我小结(1)