Handler运行机制详解

1、android线程间的通讯,都是经过Handler在线程之间的切换。包括耗时任务的结果传送到UI线程等。

2、Handler使用包括2种形式,一种是主线程和子线程的交互,另外一种是子线程和子线程之间的交互。

3、Handler的创建,主线传入Looper.getMainLooper;如果是在子线程中创建,则需要在Looper.prepare(); 和 Loop.loop之间创建,否则会抛出异常。

4、Handler 的消息机制分为5个部分,Handler、message、Message Queue、Looper、ThreadLocal,以下将对此5部分分别进行详解。

  • Message,Message 是线程之间传递的消息,通过handler的sendMessage发送。message包含4个常用字段,what、arg1、arg2、obj。obj携带对象,其他的携带整形数据。

  • Message Queue:消息队列即是存储Handler发送的message存储的地方,message是通过一个单链表的结构来维护消息列表的,先进先出。每个线程只有一个Message Queue。Handler中的MessageQueue实际是Looper中定义的MessageQueue。

  • Looper:Looper的loop是一个无线循环,message queue中消息都是经过Looper无线循环中取出来的,直到消息队列为空;如果进来新的消息,因为Looper是个无线循环,可以马上取进来的message。

  • ThreadLocal:Looper中定义了TheadLocal,每个线程保持了一个Looper副本,因此Looper对线程是唯一的。ThreadLocal是创建线程局域变量,即是每个线程中创建数据的一个副本。那么本数据副本只对本线程可见,就解决了多线程问题。ThreadLocal应用场景为数据库链接、Session链接。ThreadLocal详解请见以下链接:

  • http://blog.****.net/wangqiubo2010/article/details/79465619
  • Handler消息处理机制见下图。

Handler运行机制详解

根据以上的总结,以下将通过源码对Handler进行详细讲解。

  • Handler的消息机制分为5个部分,Handler、message、Message Queue、Looper、ThreadLocal,其定义如下:
    Handler运行机制详解
    Handler运行机制详解

Handler运行机制详解

  • Looper是Handler的消息机制的关键属性,其源码解析其功能如下:
    Handler运行机制详解
    Handler运行机制详解

Handler运行机制详解

  • MessageQueue的异步解析,通过以下备注可知,异步脱离了Looper维护Handler消息处理的顺序性的本质,提示谨慎使用,因此这个异步标志很少会用到。
    Handler运行机制详解