一,Handler的作用
Handler的作用是跨线程通信。Handler可以轻松地将一个任务切换到Handler所在的线程中去执行。常用于在子线程中进行耗时操作后,通过Handler切换到主线程中进行UI更新。
二,Handler的组成
Message(消息):需要被传递的消息,其中包含了消息ID,消息处理对象以及处理的数据等,由MessageQueue统一列队,最终由Handler处理。
MessageQueue(消息队列):用来存放Handler发送过来的消息,内部通过单链表的数据结构来维护消息列表,等待Looper的抽取。MessageQueue是一个优先级队列,MessageQueue里面的元素根据实际执行时间的先后排序。
Handler(处理者):负责Message的发送及处理。通过 Handler.sendMessage() 向消息池发送各种消息事件;通过 Handler.handleMessage() 处理相应的消息事件。
Looper(消息泵):通过Looper.loop()不断地从MessageQueue中抽取Message,按分发机制将消息分发给目标处理者。
三,Handler的工作原理
Handler的工作原理主要分为两部分
1,发送消息到消息队列。Handler把Message插入MessageQueue中。
2,从消息队列取出消息,并分发处理。Looper不断从MessageQueue取出Message并分派给相应的Handler进行处理。
四,Handler工作流程的源码分析
1,Handler如何把消息插入到消息列表
通过观察源码,我们发现,无论是Handler.sendXXX()方法还是Handler.post()方法,最后都会调用Handler.enqueueMessage()方法,里面又调用了MessageQueue.enqueueMessage()方法。
下面我们来看MessageQueue.enqueueMessage()方法的源码:
boolean enqueueMessage(Message msg, long when) {
//省略代码
msg.markInUse();
msg.when = when;
Message p = mMessages;
boolean needWake;
//msg是想要插入的新消息
//when是新消息的执行时间
// mMessage 和 p 是原队列的头部节点
if (p == null || when == 0 || when < p.when) {
//如果满足以下条件之一,把新消息插到队列头部
//1,p == null 队列为空
//2,when == 0 新消息要求立刻执行
//3,when < p.when 新消息的执行时间早于队列头部节点的执行时间
msg.next = p;
mMessages = msg;
needWake = mBlocked;
} else {
//否则插入到队列中间
needWake = mBlocked && p.target == null && msg.isAsynchronous();
Message prev;
//遍历队列,寻找合适的插入位置
for (;;){
prev = p;
p = p.next;