2013-08-30 25 views
5

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

は私がinvalidate()によってトリガUIメッセージは、今直接UIメッセージキューの代わりに振付する掲載されていることを知っており、これらのメッセージは、次のVSYNC信号が来るまで実行されません。

このポスト操作が実行される前に、ViewRootImplが機能performTraversals()前に発生messagesQueueに投稿したメッセージこのブロックが除去されるまで、後に実行されませんが、意味UIメッセージキューをブロックするために、一度ルーパーのpostSyncBarrier()を呼び出します。以上のことから

invalidate()はどこか(例えば任意のビューインスタンスのonDraw()など)performTraversals()以内に一度も呼び出された場合はUIメッセージキューが永遠にブロックされますか?

実用的な観察から、私はこれが決して起こらないことを知っています。
だから、どこが間違っていますか?

答えて

1

私はあなたがscheduleTraversalsためのコードを見て、この質問に対する答えを得ることができると思う:

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

scheduleTraversalsmTraversalScheduledへの最初の呼び出しがtrueに設定された後。それ以降の呼び出しは影響を受けず、は呼び出されず、unscheduleTraversalsが呼び出されるまで、2番目のバリアはキューに入れられません。