我只是在研究Android框架(v4.1)的代码。

我知道现在由invalidate()触发的UI消息将直接发布到Choreographer而不是UI messageQueue,并且这些消息将在下一个 VSYNC 信号到来之前不会执行。

在执行此发布操作之前,ViewRootImpl会调用Looper的postSyncBarrier()一次,以阻止UI MessageQueue,这意味着稍后发布到messageQueue中的消息直到该块被删除才执行,这是在函数performTraversals()之前发生的。

基于以上理解,



从实际观察,我知道这永远不会发生。
那么,我在哪里错了?

最佳答案

我认为您可以通过查看scheduleTraversals的代码来获得此问题的答案:

void scheduleTraversals() {
    if (!mTraversalScheduled) {
        mTraversalScheduled = true;
        mTraversalBarrier = mHandler.getLooper().postSyncBarrier();
        mChoreographer.postCallback(
                Choreographer.CALLBACK_TRAVERSAL, mTraversalRunnable, null);
        if (!mUnbufferedInputDispatch) {
            scheduleConsumeBatchedInput();
        }
        notifyRendererOfFramePending();
    }
}

首次调用scheduleTraversals后,将mTraversalScheduled设置为true。后续调用没有影响,在调用postSyncBarrier之前,不会调用unscheduleTraversals,也不会在队列上放置第二个屏障。

10-07 20:06