2013-08-30 18 views
5

Sadece Android framework koduyla ilgili çalışıyordum (v4.1).Koreograf nasıl çalışır?

Ben invalidate() tetiklediği UI mesajı artık doğrudan UI MessageQueue yerine koreograf gönderildiğinize biliyoruz ve bu mesajların sonraki VSYNC sinyal gelene kadar yürütülmez. Bu gönderim işlemi yapılmadan önce

, ViewRootImpl kez bu blok kaldırılıncaya kadar fonksiyonu performTraversals() önce olur ki, yürütülmez sonra messagesQueue içine yazılan mesajları ile uğraşmaktan UI MessageQueue engellemek için Looper adlı postSyncBarrier() çağırır. Yukarıdaki açıklamalar çerçevesinde

,

bir invalidate() bir kez bile bir yere performTraversals() (örneğin bir görünüşüdür örneklerinin onDraw()gibi) UI MessageQueue sonsuza kadar engellenir içinde adı ise? Pratik gözlemlerden

, bu hiç olmaz biliyoruz.
Peki, nerede yanlışyım?

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

mTraversalScheduled gerçek ayarlanır scheduleTraversals ilk çağrı sonra:

cevap

1

Sana scheduleTraversals için kod bakarak bu sorunun cevabını alabilirsiniz düşünüyorum. Sonraki aramaların hiçbir etkisi yoktur, postSyncBarrier aranmaz ve unscheduleTraversals aranana kadar kuyruğa ikinci bir engel konulmaz.