当前位置: 代码迷 >> 综合 >> UI 布局更新流程
  详细解决方案

UI 布局更新流程

热度:18   发布时间:2024-02-09 08:24:12.0

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,

  相关解决方案