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 yereperformTraversals()
(örneğin bir görünüşüdür örneklerininonDraw()
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: