我刚学习Android框架代码(v4.1)。
我知道由invalidate()
触发的UI消息现在直接发布到Choreographer而不是UI messageQueue,并且在下一个 VSYNC 信号到来之前不会执行这些消息。
在执行此post操作之前,ViewRootImpl
调用Looper的postSyncBarrier()
一次以阻止UI MessageQueue,这意味着稍后发送到messagesQueue的消息将被删除,直到删除此块为止在函数performTraversals()
之前发生。
基于以上理解,
如果在
invalidate()
内的某个地方调用了另一个performTraversals()
(例如onDraw()
任何视图实例)UI messageQueue永远被阻止?
从实际观察中,我知道这种情况从未发生过 那么,我哪里错了?
答案 0 :(得分:1)
我认为你可以通过查看scheduleTraversals
的代码来获得这个问题的答案:
void scheduleTraversals() {
if (!mTraversalScheduled) {
mTraversalScheduled = true;
mTraversalBarrier = mHandler.getLooper().postSyncBarrier();
mChoreographer.postCallback(
Choreographer.CALLBACK_TRAVERSAL, mTraversalRunnable, null);
if (!mUnbufferedInputDispatch) {
scheduleConsumeBatchedInput();
}
notifyRendererOfFramePending();
}
}
第一次调用scheduleTraversals
mTraversalScheduled
后设置为true。后续调用没有影响,在调用postSyncBarrier
之前,不会调用unscheduleTraversals
并且不会在队列上放置第二个障碍。