2013-08-30 7 views
5

funktioniert wurde ich nur über Code von Android Rahmen des Studiums (v4.1).Wie Choreographer

Ich weiß, dass die UI-Nachricht jetzt durch invalidate() ausgelöst wird gebucht statt UI Message direkt an Choreograph, und diese Nachrichten werden nicht bis zum nächsten VSYNC Signal kommt ausgeführt werden.

Vor dieser nach der Operation durchgeführt wird, ViewRootImpl ruft Loopers postSyncBarrier() einmal um den UI Message zu blockieren, welche Nachrichten bedeutet, die in messagesQueue Post wird später nicht ausgeführt werden, bis dieser Block entfernt, was vor Funktion geschieht performTraversals().

Basierend auf dem obigen Verständnis,

Wenn ein anderer invalidate() noch einmal irgendwo für immer innerhalb performTraversals() (wie onDraw() irgendwelcher Ansicht Instanzen) die UI Message blockiert genannt wird?

Aus praktischen Beobachtungen weiß ich, dass dies nie passiert.
Also, wo liege ich falsch?

Antwort

1

glaube ich Ihnen die Antwort auf diese Frage, indem Sie auf den Code für scheduleTraversals zu bekommen:

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

Nach dem ersten Aufruf von scheduleTraversalsmTraversalScheduled true gesetzt. Nachfolgende Aufrufe haben keine Auswirkung, wird postSyncBarrier nicht aufgerufen werden und keine zweite Sperre auf der Warteschlange gestellt, bis unscheduleTraversals genannt wird.