做一个小测试:
怀疑CSDN的阅读量是假的,如果有真实小伙伴看了文章,帮忙评论回复个1,感谢。
Choreographer整体处理流程
Choreographer构造并接受Vsync信号更新UI的流程(UIThread)
通知更新UI涉及到同步屏障:
void scheduleTraversals() {
if (!mTraversalScheduled) {
mTraversalScheduled = true;
//为了提高优先级,先 postSyncBarrier
mTraversalBarrier = mHandler.getLooper().getQueue().postSyncBarrier();
mChoreographer.postCallback(
Choreographer.CALLBACK_TRAVERSAL, mTraversalRunnable, null);
}
}
同步屏障
设计目的:
在Looper循环处理Message 的时候可以优先处理队列中的某些消息,比如绘制消息。
设计方案:
两种消息: 同步消息,异步消息(默认是同步消息)
public Handler(boolean async) {
this(null, async);
}
处理消息是遍历整个列表,当插入了同步屏障(一个没有target的消息)之后,会在列表里判断查找异步消息优先处理。
消息循环处理:
if (msg != null && msg.target == null) {
//找出屏障后面的异步消息,
do {
prevMsg = msg;
msg = msg.next;
//isAsynchronous()返回true才是异步消息
} while (msg != null && !msg.isAsynchronous());
}
参考
https://blog.csdn.net/xingzhong128/article/details/102643103/