UI控件的requestLayout 和invalidate 的调用都会调用到ViewRootImpl 中的scheduleTraversals();
void scheduleTraversals() {
if (!mTraversalScheduled) {
mTraversalScheduled = true;
//同步屏障:往消息队列插入一个同步屏障消息,这时候消息队列中的同步消息不会被处理,而是优先处理异步消息。
//消息队列中do while循环,遍历链表,直到找到异步消息msg.isAsynchronous()才跳出循环交给Handler去处理这个异步消息
mTraversalBarrier = mHandler.getLooper().getQueue().postSyncBarrier();
mChoreographer.postCallback(// 一 ,将线程放到队列,等待,最后的doFrame中执行TraversalRunnable
Choreographer.CALLBACK_TRAVERSAL, mTraversalRunnable, null);
if (!mUnbufferedInputDispatch) {
scheduleConsumeBatchedInput();
}
notifyRendererOfFramePending(); // 二
pokeDrawLockIfNeeded(); // 三
}
}
private void postCallbackDelayedInternal(int callbackType,
Object action,