Android之Handler详解(三)

c、将消息队列绑定到子线程上,主线程只管通过Handler往子线程的消息队列中投递消息即可。

package com.dxyh.test;import android.app.Activity;import android.os.Bundle;import android.os.Handler;import android.os.HandlerThread;import android.os.Looper;import android.os.Message;import android.util.Log;public class MainActivity extends Activity {private final static String TAG = "HandlerTest";private final static int TASK_BEGIN= 1;private final static int TASK_1= 2;private final static int TASK_2= 3;private final static int TASK_END= 4;private MyHandler mHandler = null;    /** Called when the activity is first created. */    @Override    public void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.main);        Log.i(TAG, "[M_TID:" + Thread.currentThread().getId() + "]" +        "This is in main thread.");                HandlerThread myLooperThread = new HandlerThread("my looper thread");        myLooperThread.start();                Looper looper = myLooperThread.getLooper();        mHandler = new MyHandler(looper);                // 启动任务(消息只有标识,立即投递)mHandler.sendEmptyMessage(TASK_BEGIN);Log.i(TAG, "[S_ID:" + Thread.currentThread().getId() + "]" +"Send TASK_START to handler.");// 开始任务1(在mHandler的消息队列中获取一个Message对象,避免重复构造)Message msg1 = mHandler.obtainMessage(TASK_1);msg1.obj = "This is task1";mHandler.sendMessage(msg1);Log.i(TAG, "[S_ID:" + Thread.currentThread().getId() + "]" +"Send TASK_1 to handler.");// 开启任务2(和上面类似)Message msg2 = Message.obtain();msg2.arg1 = 10;msg2.arg2 = 20;msg2.what = TASK_2;mHandler.sendMessage(msg2);Log.i(TAG, "[S_ID:" + Thread.currentThread().getId() + "]" +"Send TASK_2 to handler.");// 结束任务(空消息体,延时2s投递)mHandler.sendEmptyMessageDelayed(TASK_END, 2000);Log.i(TAG, "[S_ID:" + Thread.currentThread().getId() + "]" +"Send TASK_END to handler.");    }        class MyHandler extends Handler {    public MyHandler(Looper looper) {    super(looper);    }        // 现在在每个case之后,你可以做任何耗时的操作了    @Override    public void handleMessage(Message msg) {    switch (msg.what) {    case TASK_BEGIN:    Log.i(TAG, "[H_TID:" +    Thread.currentThread().getId() + "] Get TASK_BEGIN");    break;        case TASK_1:    Log.i(TAG, "[H_TID:" +    Thread.currentThread().getId() + "] Get TASK_1");    break;        case TASK_2:    Log.i(TAG, "[H_TID:" +    Thread.currentThread().getId() + "] Get TASK_2");    break;        case TASK_END:    Log.i(TAG, "[H_TID:" +    Thread.currentThread().getId() + "] Get TASK_END");    finish();    break;    }    super.handleMessage(msg);    }    }}

运行结果:

Android之Handler详解(三)

更多相关文章

  1. Android应用程序键盘(Keyboard)消息处理机制分析(5)
  2. Android Sqlite 数据库多线程操作
  3. [Android] 图片JNI(C++\Java)高斯模糊 多线程
  4. Android应用程序中模拟发送键盘触摸消息
  5. SQLite多线程操作数据库
  6. Android 线程池使用
  7. android Thread 数据加载 ProgressDialog 请求超时处理 线程 Han

随机推荐

  1. 下载各个版本SDK Tools及ADT的技巧
  2. Android(安卓)之Google认证GMS详细解剖
  3. Android(安卓)开机自启动应用
  4. 2011.09.15 ——— android 桌面添加快捷
  5. 新浪微博Android客户端学习记录四:完成OAu
  6. Android(安卓)亲测源码分享
  7. android环境配置(adb问题)
  8. Android(安卓)Permission的 protectLevel
  9. 关于android 的触摸事件
  10. android linux 最全的基础知识总结