5

Android フレームワーク (v4.1) のコードについて勉強していました。

これまでにトリガーされた UI メッセージinvalidate()は、UI messageQueue ではなく Choreographer に直接ポストされ、これらのメッセージは次のVSYNC信号が来るまで実行されないことがわかっています。

この post 操作が実行される前に、UI MessageQueue をブロックするためにViewRootImplLooper をpostSyncBarrier()1 回呼び出します。これは、後で messagesQueue に投稿されるメッセージは、このブロックが削除されるまで実行されないことを意味します。これは function の前に発生しますperformTraversals()

以上の理解に基づき、

別のものが(ビューインスタンスなどの)invalidate()どこかで一度でも呼び出された場合、UI messageQueue は永久にブロックされますか?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ず、呼び出されず、2 番目のバリアは呼び出されるまでキューに置かれませんunscheduleTraversals

于 2015-08-09T23:01:53.717 に答える