UI介面快速展示優化-巧用訊息佇列MessageQueue中IdleHandler及SyncBarrier
阿新 • • 發佈:2019-01-01
Android App開發中介面顯示正常情況下要麼時獲取網路資料或者資料庫之後再顯示介面,要麼時等Ui繪製完成之後再渲染展示資料。這兩種情況下UI 控制元件初始化必須先行,然後再非同步獲取資料,獲取成功之後,再Ui渲染資料。這是一個序列的流程,如果可以把UI控制元件初始化和非同步獲取資料並行,甚至先行獲取,等Ui控制元件完成之後再通知UI渲染資料,那就會在不修改業務程式碼的前提下得到大大的提升介面展示速度。下面介紹如何得到UI渲染結束時機,如何利用MessageQueue的同步障礙機制來實現通知訊息機制中斷和繼續執行。
UI渲染時機回撥,沒有系統的生命週期回撥,在前面的文章中又提到分析原始碼瞭解View.post機制實現獲取View的尺寸。
1、IdleHandler
可以用來再UI執行緒空閒的時候,進行任務,避免阻塞UI繪製,以及在單獨的訊息迴圈機制中來實現空閒時機回撥。
public static interface IdleHandler {
/**
* Called when the message queue has run out of messages and will now
* wait for more. Return true to keep your idle handler active, false
* to have it removed. This may be called if there are still messages
* pending in the queue, but they are all scheduled to be dispatched
* after the current time.
*/
boolean queueIdle();
}
2、SyncBarrier
瞭解系統是如何利用非同步訊息障礙來實現提高Ui繪製和響應的流暢度,可以用來作為單執行緒訊息佇列中阻塞佇列執行,來完成某個時機達到之後,繼續執行佇列的任務。系統中利用同步障礙訊息來阻塞主執行緒佇列,才能讓Ui繪製message能夠優先得到執行。
3、利用IdleHandler來實現監聽訊息佇列空閒時機
巧用在UI主執行緒中監聽到所有訊息包括UI繪製Message執行完成之後,來實現Ui繪製完成之後獲取Ui尺寸以及Ui 展示時機,不阻塞UI顯示。
4、兩者結合起來做個預載入機制
在主線中 add IdleHandler,會自動回撥;並行執行獲取網路資料任務Task1(onCreate之前),並post同步障礙到非同步HanderThread中,再post UI設定網路資料任務Task2,當主執行緒空閒時,通知非同步HandlerThread 進行remove 同步障礙,使得Task2任務得到執行,這個時候進行UI渲染資料。