Android之Handler详解(三)

来源:互联网 发布:人工智能的应用新闻 编辑:程序博客网 时间:2024/05/21 17:36

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

Java代码 复制代码 收藏代码
[java] view plaincopy
  1. package com.dxyh.test;     
  2.     
  3. import android.app.Activity;     
  4. import android.os.Bundle;     
  5. import android.os.Handler;     
  6. import android.os.HandlerThread;     
  7. import android.os.Looper;     
  8. import android.os.Message;     
  9. import android.util.Log;     
  10.     
  11. public class MainActivity extends Activity {     
  12.     private final static String TAG = "HandlerTest";     
  13.          
  14.     private final static int TASK_BEGIN = 1;     
  15.     private final static int TASK_1 = 2;     
  16.     private final static int TASK_2 = 3;     
  17.     private final static int TASK_END   = 4;     
  18.          
  19.     private MyHandler mHandler = null;     
  20.          
  21.     /** Called when the activity is first created. */    
  22.     @Override    
  23.     public void onCreate(Bundle savedInstanceState) {     
  24.         super.onCreate(savedInstanceState);     
  25.         setContentView(R.layout.main);     
  26.     
  27.         Log.i(TAG, "[M_TID:" + Thread.currentThread().getId() + "]" +     
  28.                 "This is in main thread.");     
  29.              
  30.         HandlerThread myLooperThread = new HandlerThread("my looper thread");     
  31.         myLooperThread.start();     
  32.              
  33.         Looper looper = myLooperThread.getLooper();     
  34.         mHandler = new MyHandler(looper);     
  35.              
  36.         // 启动任务(消息只有标识,立即投递)     
  37.         mHandler.sendEmptyMessage(TASK_BEGIN);     
  38.         Log.i(TAG, "[S_ID:" + Thread.currentThread().getId() + "]" +     
  39.                 "Send TASK_START to handler.");     
  40.              
  41.         // 开始任务1(在mHandler的消息队列中获取一个Message对象,避免重复构造)     
  42.         Message msg1 = mHandler.obtainMessage(TASK_1);     
  43.         msg1.obj = "This is task1";     
  44.         mHandler.sendMessage(msg1);     
  45.         Log.i(TAG, "[S_ID:" + Thread.currentThread().getId() + "]" +     
  46.                 "Send TASK_1 to handler.");     
  47.              
  48.         // 开启任务2(和上面类似)     
  49.         Message msg2 = Message.obtain();     
  50.         msg2.arg1 = 10;     
  51.         msg2.arg2 = 20;     
  52.         msg2.what = TASK_2;     
  53.         mHandler.sendMessage(msg2);     
  54.         Log.i(TAG, "[S_ID:" + Thread.currentThread().getId() + "]" +     
  55.                 "Send TASK_2 to handler.");     
  56.              
  57.         // 结束任务(空消息体,延时2s投递)     
  58.         mHandler.sendEmptyMessageDelayed(TASK_END, 2000);     
  59.         Log.i(TAG, "[S_ID:" + Thread.currentThread().getId() + "]" +     
  60.                 "Send TASK_END to handler.");     
  61.     }     
  62.          
  63.     class MyHandler extends Handler {     
  64.         public MyHandler(Looper looper) {     
  65.             super(looper);     
  66.         }     
  67.              
  68.         // 现在在每个case之后,你可以做任何耗时的操作了     
  69.         @Override    
  70.         public void handleMessage(Message msg) {     
  71.             switch (msg.what) {     
  72.             case TASK_BEGIN:     
  73.                 Log.i(TAG, "[H_TID:" +     
  74.                     Thread.currentThread().getId() + "] Get TASK_BEGIN");     
  75.                 break;     
  76.                      
  77.             case TASK_1:     
  78.                 Log.i(TAG, "[H_TID:" +     
  79.                     Thread.currentThread().getId() + "] Get TASK_1");     
  80.                 break;     
  81.                      
  82.             case TASK_2:     
  83.                 Log.i(TAG, "[H_TID:" +     
  84.                     Thread.currentThread().getId() + "] Get TASK_2");     
  85.                 break;     
  86.                      
  87.             case TASK_END:     
  88.                 Log.i(TAG, "[H_TID:" +     
  89.                     Thread.currentThread().getId() + "] Get TASK_END");     
  90.                 finish();     
  91.                 break;     
  92.             }     
  93.             super.handleMessage(msg);     
  94.         }     
  95.     }     
  96. }    

运行结果:

原创粉丝点击