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