消息主要分为
- 同步
- 异步
一般来说,二者没区别,只有遇到同步屏障才有差异
同步屏障
View绘制时,Looper使用同步屏障确保下一帧绘制完之前其他同步消息暂不处理,异步消息不受同步屏障限制
工作原理
在MessageQueue中可看到:当出现消息屏障时,优先执行异步消息
- msg.target == null 用于判断有有消息屏障(?)
- !msg。isAsynchronous 该消息是否异步
为什么msg.target == null 用于判断有有消息屏障 在enqueueMessage时,为了判断该消息属于哪个Handler,会将当前handler赋值给msg.target,也就是
msg.target什么时候会为空,google说过用于绘制View时设置同步屏障
在以上代码中可知:当实现了postSyncBarrier时,该事件会被立即执行,优先于其他事件。
所以View的绘制会变成异步消息优先执行
设置消息优先级:
- 同步屏障(针对同步与异步消息之间)
- 设置delayTime
- sendMessageArFrontOfQueue
除了第一个,后两个的优先级传入的时间,最终都会调用enqueueMessage去解决消息
delayTime 设置延迟时间:
传入的时间最小为系统当前时间,最大为系统当前时间 + 延时
sendMessageAtFrontOfQueue 放队头
传入的时间为0
时间传0与非0的区别
优先级:
什么时候会触发when<p.when 除了0以外存在一种消息发送的时间大于头结点
sendMessageAtTime,可以指定在某个指定时间执行 由下图可见,没有对传入时间作限制
可以试验一下
IdleHandler:
MessageQueue消息队列没有消息或下次消息执行时间未到(系统空闲)时执行的任务
由上可见:执行顺序为异步》同步》idleHandler