Android线程模型剖析之handler


1. handler

1.1 概述

  • 处理对象:handler是用来发送、处理线程中MessageQueue里的消息或者Runnable的对象;
  • 实例特点:一个handler的实例对应于一个线程和该线程的 MessageQueue;
  • 自动绑定:当handler被创建之后,它就自动和创建它的线程和MessageQueue绑定在一起;

1.2  用途

  • 延时处理:将消息或者Runnables放在将来的某个时间点去执行;
  • 多线程间:将排队等候执行的操作放到其它的线程里面去执行。

1.3 说明

  • 时间延迟:我们知道handler处理的操作都是放在一个queue里面的,因此当我们post一个runnable(post(Runnable r))之后,要想很快执行后面的操作则需要等待;

sample:

  1. public class MainAcitivty extends Activity {  
  2.     private final static int CMD_MSG = 0;  
  3.     private final static String TAG = "TAG";  
  4.     private final Handler mHandler = new Handler() {  
  5.   
  6.         @Override  
  7.         public void handleMessage(Message msg) {  
  8.             switch(msg.what) {  
  9.                 case CMD_MSG:  
  10.                     Android.util.Log.d(TAG, "CMD_MSG");  
  11.                     break;  
  12.             }  
  13.         }  
  14.     };  
  15.       
  16.     /** Called when the activity is first created. */  
  17.     @Override  
  18.     public void onCreate(Bundle savedInstanceState) {  
  19.         super.onCreate(savedInstanceState);  
  20.         setContentView(R.layout.main);  
  21.         sendMessage();  
  22.     }  
  23.       
  24.     private void sendMessage() {  
  25.         mHandler.post(new Runnable() {  
  26.               
  27.             @Override  
  28.             public void run() {  
  29.                 SystemClock.sleep(5000);  
  30.             }  
  31.         });  
  32.         mHandler.obtainMessage(CMD_MSG).sendToTarget();  
  33.     }  
  34. }  
  • handler数量:一个handler一定对应一个线程,反过来在一个线程里面却可以创建多个handler;

sample:

  1. public class MainAcitivty extends Activity {  
  2.     private final static int CMD_MSG = 0;  
  3.     private final static String TAG = "TAG";  
  4.     private final Handler mHandler1 = new Handler() {  
  5.   
  6.         @Override  
  7.         public void handleMessage(Message msg) {  
  8.             switch(msg.what) {  
  9.                 case CMD_MSG:  
  10.                     android.util.Log.d(TAG, "CMD_MSG");  
  11.                     break;  
  12.             }  
  13.         }  
  14.     };  
  15.       
  16.     private final Handler mHandler2 = new Handler() {  
  17.   
  18.         @Override  
  19.         public void handleMessage(Message msg) {  
  20.             switch(msg.what) {  
  21.                 case CMD_MSG:  
  22.                     android.util.Log.d(TAG, "CMD_MSG");  
  23.                     break;  
  24.             }  
  25.         }  
  26.     };  
  27.       
  28.     /** Called when the activity is first created. */  
  29.     @Override  
  30.     public void onCreate(Bundle savedInstanceState) {  
  31.         super.onCreate(savedInstanceState);  
  32.         setContentView(R.layout.main);  
  33.         sendMessage();  
  34.     }  
  35.       
  36.     private void sendMessage() {  
  37.         mHandler1.obtainMessage(CMD_MSG).sendToTarget();  
  38.         mHandler2.obtainMessage(CMD_MSG).sendToTarget();  
  39.     }  

由于一个线程里面只有一个Looper和消息队列,上面的两个handler共享了一个消息队列,但是Message发送的target却不一样,所以2个handler都接受到了消息。

  • handleMessage的调用过程:Looper.loop() -> dispatchMessage -> handleMessage;

相关内容