我只是在研究Android框架(v4.1)的代码。
我知道现在由invalidate()
触发的UI消息将直接发布到Choreographer而不是UI messageQueue,并且这些消息将在下一个 VSYNC 信号到来之前不会执行。
在执行此发布操作之前,ViewRootImpl
会调用Looper的postSyncBarrier()
一次,以阻止UI MessageQueue,这意味着稍后发布到messageQueue中的消息直到该块被删除才执行,这是在函数performTraversals()
之前发生的。
基于以上理解,
从实际观察,我知道这永远不会发生。
那么,我在哪里错了?
最佳答案
我认为您可以通过查看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
,也不会在队列上放置第二个屏障。