HandlerThread

大多數情況下,AsyncTask都能夠滿足multi-thread Comcurrent的場景需要(在工作線程執行任務並返回結果到主線程),但是它並不是萬能的。例如打開相機之後的預覽幀數據是通過onPreviewFrame()的方法進行回調的,onPreviewFrame()open()相機的方法是執行在同一個線程的。

如果這個Callback執行在UI線程,那麼在onPreviewFrame()裡面將要執行的數據轉換操作將和主線程的界面繪製,事件傳遞等操作爭搶系統資源,這就有可能影響到主界面的表現性能。

我們需要確保onPreviewFrame()執行在工作線程。如果使用AsyncTask,會因為AsyncTask默認的線性執行的特性(即使換成並發執行)會導致因為無法把任務及時傳遞給工作線程而導致任務在主線程中被延遲,直到工作線程空閒,才可以把任務切換到工作線程中進行執行。

所以我們需要的是一個執行在工作線程,同時又能夠處理隊列中的複雜任務的功能,而HandlerThread的出現就是為了實現這個功能的,它組合了Handler,MessageQueue,Looper實現了一個長時間運行的線程,不斷的從隊列中獲取任務進行執行的功能。

回到剛才的處理相機回調數據的例子,使用HandlerThread我們可以把open()操作與onPreviewFrame()的操作執行在同一個線程,同時還避免了AsyncTask的弊端。如果需要在onPreviewFrame()裡面更新UI,只需要調用runOnUiThread()方法把任務回調給主線程就夠了。

HandlerThread比較合適處理那些在工作線程執行,需要花費時間偏長的任務。我們只需要把任務發送給HandlerThread,然後就只需要等待任務執行結束的時候通知返回到主線程就好了。

另外很重要的一點是,一旦我們使用了HandlerThread,需要特別注意給HandlerThread設置不同的線程優先級,CPU會根據設置的不同線程優先級對所有的線程進行調度優化。

掌握HandlerThread與AsyncTask之間的優缺點,可以幫助我們選擇合適的方案。

results matching ""

    No results matching ""