消息机制

107 阅读2分钟

原链接:juejin.cn/post/733697…

消息主要分为

  • 同步
  • 异步

image.png

image.png

一般来说,二者没区别,只有遇到同步屏障才有差异

同步屏障

View绘制时,Looper使用同步屏障确保下一帧绘制完之前其他同步消息暂不处理,异步消息不受同步屏障限制

工作原理

在MessageQueue中可看到:当出现消息屏障时,优先执行异步消息

image.png

  • msg.target == null 用于判断有有消息屏障(?)
  • !msg。isAsynchronous 该消息是否异步

为什么msg.target == null 用于判断有有消息屏障 在enqueueMessage时,为了判断该消息属于哪个Handler,会将当前handler赋值给msg.target,也就是

image.png

msg.target什么时候会为空,google说过用于绘制View时设置同步屏障

image.png

image.png

在以上代码中可知:当实现了postSyncBarrier时,该事件会被立即执行,优先于其他事件。

所以View的绘制会变成异步消息优先执行

设置消息优先级:

  • 同步屏障(针对同步与异步消息之间)
  • 设置delayTime
  • sendMessageArFrontOfQueue

除了第一个,后两个的优先级传入的时间,最终都会调用enqueueMessage去解决消息

delayTime 设置延迟时间:
传入的时间最小为系统当前时间,最大为系统当前时间 + 延时 image.png sendMessageAtFrontOfQueue 放队头
传入的时间为0 image.png

时间传0与非0的区别

image.png

优先级:

image.png

什么时候会触发when<p.when 除了0以外存在一种消息发送的时间大于头结点 image.png

sendMessageAtTime,可以指定在某个指定时间执行 由下图可见,没有对传入时间作限制

image.png

image.png

可以试验一下

image.png

IdleHandler:
MessageQueue消息队列没有消息或下次消息执行时间未到(系统空闲)时执行的任务 image.png 由上可见:执行顺序为异步》同步》idleHandler

image.png