2011-12-20

Android AsyncTask 與 Handler Thread 的差異

Android UI 不是 Thread Safe,所以 UI 的互動均由 Main Thread 負責,即執行 Activity 那個 Thread,其他 Thread 均不能更新 UI,基於 UI 的親善,Main Thread 不可以執行費時的工作,否則 User 會因此看到一個失能的 UI 而暴走,因此當 Main Thread 出現五秒以上的運算時,Android 就會丟出 ANR 讓 User 可以選擇等待或離去。

費時的工作包括網路存取、檔案處理、資料庫讀取或僅只是費時的計算。

因此,費時的工作得另起 Thread 來處理,如果這費時的工作處理過程或結果不用與 UI 互動,那麼只要起一個一般的 Thread 即可,但是多半不會這樣,所以就出現了 AsyncTaskHandler Thread

之所以會一起比較 AyncTask 與 Handler Thread 的原因就在於他們提供相同的功能,即另起 Thread 進行費時的工作,且可以透過 Main Thread 修改 UI。

先講結論,基於易用與可靠性,Android 建議使用 AsyncTask。

AsyncTask 出現的目的就是在提供簡單易用的方式達成上述的功能,不像 Handler Thread 得與 Handler、Thread 與 Message Queue 搏鬥,AsyncTask 只要定義幾個 Callback 就可以上路了。

AsyncTask 內部實做機制為較新且較強的 java.util.concurrent,但較佔資源,而 Handler Thread 則為基本的 Java Thread。

由於 Handler Thread 依靠 Message Queue 與 Main Thread 互動,相對於 AsyncTask,Handler Thread 比較可能發生塞車情況。

但 Handler Thread 在即時互動上優於 AsyncTask,因為 Main Thread 可以隨時傳送 Message 給 Handler Thread,而 AsyncTask 不行,只能依照事先定義 Callback 進行。

基於輕量環境資源的有限,當執行單一的工作時建議使用 AsyncTask,如下載一個大檔案,但是當執行大量重複性的工作時,建議使用 Handler Thread,如下載多個小圖。

相關文章

4 則留言: