Choreographer整体处理流程 Choreographer构造并接受Vsync信号更新UI的流程(UIThread) 通知更新UI涉及到同步屏障:
void scheduleTraversals() {
if (!mTraversalScheduled) {
mTraversalScheduled = true;
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;
} while (msg != null && !msg.isAsynchronous());
}
参考
https://blog.csdn.net/xingzhong128/article/details/102643103/
|