走进Android之Handler第二节 Message被插入到MessageQueue的详细过程

本小节我们看看Message被插入到MessageQueue的详细过程

前面一小节我们已经知道了从平常的sendMessage(msg)开始,最终到sendMessageAtTime(msg,uptimeMillis)



通过注释我们知道,将该消息插入到消息队列中,并且该消息处于消息队列中所有待处理的消息的后面。在uptimeMillis这个时刻之前。 你将会在该线程相关联的handler的handleMessage()中接收到此消息,通过此Handler的mQueue来实例化一个MessageQueue.如果该MessageQueue不为null.就执行enqueueMessage(queue, msg, uptimeMillis);


此函数没有任何注释。我们就通过看代码来了解它具体干了些啥

将本类对象即handler赋值给Message中的target字段 。

追踪是谁触发了本线程当前正在执行的工作。(UUID由框架层生成的)

如果Handler中的字段mAsynchronous为true.那么就将该消息设置为异步

最后是执行了queue.enqueueMessage(msg, uptimeMillis);


将我们传的实参when 赋值给实参msg中的when字段。将MessageQueue中的消息字段mMessages 用来实例化一个Message局部变量。

我们重点看下外面的这段if else 逻辑

如果消息队列中的消息为null ,那么就将传进来的消息 赋值给消息队列中的消息

如果传进来的when字段等于0,那么就将传进来的消息 赋值给消息队列中的消息

如果传进来的when字段不为0 且小于 消息队列中的消息的when字段。那么就将消息队列中原来的消息 变更 为下一次要处理的消息。将传进来的消息变更为消息队列中消息


else  如果消息队列中 原来的消息不为空,传进来的实参中的when字段不等于零 ,传进来实参的when字段不小于 消息队列中原来的消息的when字段。

如果传进来的实参msg 不是异步消息。那么needWake变量的值就会被赋为false.紧接着声明一个中间变量 Message prev

开启一个死循环

将消息队列中原本存在的消息赋给中间变量prev ,再将消息队列中的下一条消息 赋值给变量p

如果p为null 就跳出死循环 

或者p不为空 传进来的实参when 字段 小于p的when字段 就跳出死循环 。


将实参中的消息 放在原本消息队列中的下一条消息的前面。

这就是将消息插入到消息队列中的整个过程

你可能感兴趣的:(走进Android之Handler第二节 Message被插入到MessageQueue的详细过程)