编舞如何工作

时间:2013-08-30 07:52:49

标签: android android-framework

我刚学习Android框架代码(v4.1)。

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

在执行此post操作之前,ViewRootImpl调用Looper的postSyncBarrier()一次以阻止UI MessageQueue,这意味着稍后发送到messagesQueue的消息将被删除,直到删除此块为止在函数performTraversals()之前发生。

基于以上理解,

  

如果在 invalidate() 内的某个地方调用了另一个 performTraversals() (例如 onDraw() 任何视图实例)UI messageQueue永远被阻止?

从实际观察中,我知道这种情况从未发生过 那么,我哪里错了?

1 个答案:

答案 0 :(得分:1)

我认为你可以通过查看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并且不会在队列上放置第二个障碍。