编舞如何工作

Sim*_*Lee 5 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?

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

G. *_*ike 1

我想你可以通过查看代码来得到这个问题的答案scheduleTraversals

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

第一次调用后scheduleTraversals mTraversalScheduled设置为 true。后续调用没有影响,postSyncBarrier不会被调用,并且不会将第二个屏障放入队列中,直到unscheduleTraversals被调用。