5

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

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

在执行此发布操作之前,ViewRootImpl调用 Looper 的postSyncBarrier()一次以阻塞 UI MessageQueue,这意味着稍后发布到 messagesQueue 的消息将在此块被删除之前不会被执行,这发生在 function 之前performTraversals()

基于以上理解,

如果在某个地方(例如任何视图实例)中invalidate()甚至调用了另一个,那么 UI 消息队列会永远被阻止吗?performTraversals()onDraw()

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

4

1 回答 1

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被调用。

于 2015-08-09T23:01:53.717 回答