2013-08-30 68 views
5

我剛剛在研究Android框架代碼(v4.1)。編舞師如何工作

我知道,通過invalidate()觸發的UI消息現在被髮布,而不是直接到編舞UI消息隊列的,並且這些消息不會等到明年VSYNC信號來執行。

執行這個崗位操作之前,ViewRootImpl稱活套的postSyncBarrier()一次,以阻止用戶界面的MessageQueue這意味着發佈到messagesQueue以後將不會被執行,直到該塊被刪除,功能performTraversals()之前恰好消息。

基於上述認識,

如果另一個invalidate()稱爲即使一次內performTraversals()(如任何視圖的實例onDraw())的UI消息隊列永遠被阻止某處?

從實際觀察,我知道這從來沒有發生。
那麼,我錯在哪裏?

回答

1

我認爲你可以通過在代碼尋找scheduleTraversals得到這個問題的答案:

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

第一次調用scheduleTraversalsmTraversalScheduled設置爲true後。後續調用沒有影響,postSyncBarrier不會被調用,並且沒有第二個屏障放在隊列中,直到調用unscheduleTraversals