Android-初识Handler,Looper,Message(-) 源码


本文只是表面的带大家浏览下Handler,Looper,Message的源码

Android的消息处理有三个核心类:Looper,Handler和Message。其实还有一个Message Queue(消息队列),

异步处理大师 Handler:

什么是handler?handler扮演了往MQ上添加消息和处理消息的角色(只处理由自己发出的消息),即通知MQ它要执行一个任务(sendMessage),并在loop到自己的时候执行该任务(handleMessage),整个过程是异步的。handler创建时会关联一个looper,默认的构造方法将关联当前线程的looper,不过这也是可以set的。默认的构造方法:

 
  1. public class handler {     
  2.     
  3.     final MessageQueue mQueue;  // 关联的MQ      
  4.     final Looper mLooper;  // 关联的looper      
  5.     final Callback mCallback;     
  6.     // 其他属性      
  7.     
  8.     public Handler() {     
  9.         if (FIND_POTENTIAL_LEAKS) { // 没看懂,直接略过,,,      
  10.             final Class<? extends Handler> klass = getClass();     
  11.             if ((klass.isAnonymousClass() || klass.isMemberClass() || klass.isLocalClass()) &&     
  12.                     (klass.getModifiers() & Modifier.STATIC) == 0) {     
  13.                 Log.w(TAG, "The following Handler class should be static or leaks might occur: " +     
  14.                     klass.getCanonicalName());     
  15.             }     
  16.         }     
  17.         // 默认将关联当前线程的looper      
  18.         mLooper = Looper.myLooper();     
  19.         // looper不能为空,即该默认的构造方法只能在looper线程中使用     
 
  1.         //UI主线程中默认带有一个Looper   
  2.         if (mLooper == null) {     
  3.             throw new RuntimeException(//不能在没有Looper的线程上创建Handler,      
  4.                 "Can't create handler inside thread that has not called Looper.prepare()");     
  5.         }     
  6.         // 重要!!!直接把关联looper的MQ作为自己的MQ,因此它的消息将发送到关联looper的MQ上      
  7.         mQueue = mLooper.mQueue;     
  8.         mCallback = null;     
  9.     }     
  10.     
  11.     // 其他方法      
  12. }    

当然这只是Handler的一个构造方法。Handler本身有四个构造函数,其他其他的三个你可以通过查看源码来解析,大致雷同。

Handler发送消息

有了handler之后,我们就可以使用 post(Runnabl),sendMessage(Message)这些方法向MQ上发送消息了。光看这些API你可能会觉得handler能发两种消息,一种是Runnable对象,一种是message对象,这是直观的理解,但其实post发出的Runnable对象最后都被封装成message对象了,见源码:
Post发送的形式

  1. public final boolean post(Runnable r){//使用Post发送消息   
  2.       return  sendMessageDelayed(getPostMessage(r), 0);  
  3. }  
 
  1. private final Message getPostMessage(Runnable r) {//把一个Runnable包转成一个Message   
  2.        Message m = Message.obtain();  
  3.        m.callback = r;  
  4.        return m;  
  5. }  
 
  1. public final boolean sendMessageDelayed(Message msg, long delayMillis){  
  2.        if (delayMillis < 0) {  
  3.            delayMillis = 0;  
  4.        }  
  5.        return sendMessageAtTime(msg, SystemClock.uptimeMillis() + delayMillis);  
  6. }  
 
  1. <pre class="java" name="code"><pre class="java" name="code">public boolean sendMessageAtTime(Message msg, long uptimeMillis){  
  2.         boolean sent = false;  
  3.         MessageQueue queue = mQueue;  
  4.         if (queue != null) {  
 
  1. /*该handler对象,这确保了looper执行到该message时能找到处理它的handler,直白点就是ABC三个Handler发送消息,最终执行的时候Message消息  
 
  1. 也是由他们本身来执行,而不会发生A接受到B发送的Message之类的情况*/  
  2.            msg.target = this;//  
 
  1.     sent = queue.enqueueMessage(msg, uptimeMillis);//压入消息队列   
  2. }else {  
  3.     RuntimeException e = new RuntimeException(  
  4.         this + " sendMessageAtTime() called with no mQueue");  
  5.     Log.w("Looper", e.getMessage(), e);  
  6. }  
  7. return sent;  

sendMessage(Message)形式

  1.  public final boolean sendMessage(Message msg){  
  2.         return sendMessageDelayed(msg, 0);  
  3. }  
 
  1. public final boolean sendMessageDelayed(Message msg, long delayMillis){  
  2.        if (delayMillis < 0) {  
  3.            delayMillis = 0;  
  4.        }  
  5.        return sendMessageAtTime(msg, SystemClock.uptimeMillis() + delayMillis);  
  6.  }  

从源码中我们中我们可以很清晰的看到无论是用psot(Runnable)还是使用sendMessage(Message)方法,最后他们都会调用到同一个方法压入都一个队列中去。

  • 1
  • 2
  • 下一页

相关内容