2013-08-30 4 views
5

Właśnie studiowałem na temat kodu platformy Android (v4.1).Jak działa Choreographer

wiem, że wiadomość UI wywołane przez invalidate() teraz jest wysłana do choreograf zamiast UI kolejka komunikatów bezpośrednio, a te wiadomości nie będą realizowane dopiero w przyszłym VSYNC sygnał pochodzi.

Przed ta operacja jest wykonywana po, ViewRootImpl wzywa looper'a postSyncBarrier() raz w celu zablokowania UI kolejka komunikatów, co oznacza, że ​​wiadomości pocztowe na messagesQueue później nie będą wykonywane, dopóki ten blok jest usuwany, co dzieje się przed funkcją performTraversals().

Na podstawie powyższej zrozumienia,

Jeśli inny invalidate() nazywa jeszcze raz gdzieś w performTraversals() (takich jak onDraw() żadnej widok przypadkach) UI kolejka komunikatów na zawsze zostać zablokowane?

Z praktycznych obserwacji wiem, że tak się nie dzieje.
Więc, gdzie się mylę?

Odpowiedz

1

Myślę, że można uzyskać odpowiedź na to pytanie, patrząc na kod dla scheduleTraversals:

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

Po pierwszym wywołaniu scheduleTraversalsmTraversalScheduled ustawiony jest prawdą. Kolejne wywołania nie mają wpływu, postSyncBarrier nie jest wywoływane i żadna druga bariera nie jest umieszczana w kolejce, dopóki nie zostanie wywołana unscheduleTraversals.