Android MessageQueue中的同步屏障

Message中有一个方法叫Message.setAsynchronous,表示发送异步消息,然而他需要插入同步屏障才能生效,那什么是同步屏障呢?

一般来说,Message如果按顺序进行发送的,并不是设置delay的话,运行都是同步的,然而在某些特殊时期,为了提高某个消息的优先级,防止中途插入的Message导致任务调度延迟,会使用异步Message,当调用postSyncBarrier之后,之后的任意同步消息都不再执行,期间只能执行异步消息,直到移除了同步屏障。

插入屏障:MessageQueue.postSyncBarrier

往链表里插入了一个奇怪的msg,他的target为null

消息循环:MessageQueue.next

遍历消息,也就是忽略所有非异步消息,只取出异步消息

移除屏障: MessageQueue .removeSyncBarrier

移除屏障非常简单就是链表的删除

从以上的代码可以看到,同步屏障实际上就是往链表里插入了一个hander为null的特殊消息,这个消息不会被消息循环主动处理掉,因为他没有target也不知道该发给谁,但只要有这个消息在队列同步,则在他后面的任意数量的同步消息都不会有执行的机会,这种情况目前我只有在ViewRootImpl里见过

ViewRootImpl java里的用法

一般来说,如果app使用同步屏障需要非常小心,因为他会把他你的整个主线程的消息循环弄瘫痪,因此post和remove屏障都是隐藏api,但messsage.setAsynchronous 是可以使用的,也就是说,在某些情况下允许app的调度任务比绘制帧优先级高