Java Handler同步屏障浅析讲解
1.在View的加载和绘制流程这篇文章中:传送门,有一个编舞者类,mChoreographer。
mTraversalBarrier = mHandler.getLooper().postSyncBarrier();
向MessageQueue中插入一条同步屏障消息,msg.target==null的消息,返回值mTraversalBarrier是一个int 的token值。
mChoreographer.postCallback()方法会执行mTraversalRunnable中的代码。
mHandler.getLooper().removeSyncBarrier(mTraversalBarrier);
这个会根据上面产生的token值移出MessageQueue中的同步屏障消息。
还是看这行代码mHandler.getLooper().postSyncBarrier(),系统是怎么处理的。
获取了一个没有设置handler的Message。
正常我们通过handler发送消息,handler是不允许为空的。
那系统为啥要发送一个handler为空的消息呢?
先看mChoreographer发了同步屏障消息后,又做了什么?
又发送了一个异步消息:msg.setAsynchronous(true),这个消息的handler不为null。
接下来看看MessageQueue是怎么去消息的,是如何对这个同步屏障消息怎么处理的。
在取消的时候,先判断进行msg.target为null的判断,然后经过while循环,找到msg.isAsynchronous() == true的消息。也就是上面发送的异步消息。通常我们发送的消息都是同步消息,不会对对 msg.setAsynchronous(true);进行设置。
系统这样做的目的就是为了优先去处理这个异步消息。会把所有的同步消息放在后面,向一道屏障一样,所以这样的操作,被称为同步屏障,是同步屏障消息的处理有更高的优先级。
因为编舞者类mChoreographer 负责屏幕的渲染,需要及时的处理从底层过来的信号,以保障界面刷新的频率。
那么mChoreographer是如何处理信号的,如何进行渲染的逻辑是怎么样的,有机会再写文章进行分享。
到此这篇关于Java Handler同步屏障浅析讲解的文章就介绍到这了,更多相关Java Handler内容请搜索编程学习网以前的文章希望大家以后多多支持编程学习网!