Android UI 不是 Thread Safe,所以 UI 的互動均由 Main Thread 負責,即執行 Activity 那個 Thread,其他 Thread 均不能更新 UI,基於 UI 的親善,Main Thread 不可以執行費時的工作,否則 User 會因此看到一個失能的 UI 而暴走,因此當 Main Thread 出現五秒以上的運算時,Android 就會丟出 ANR 讓 User 可以選擇等待或離去。
費時的工作包括網路存取、檔案處理、資料庫讀取或僅只是費時的計算。
因此,費時的工作得另起 Thread 來處理,如果這費時的工作處理過程或結果不用與 UI 互動,那麼只要起一個一般的 Thread 即可,但是多半不會這樣,所以就出現了 AsyncTask 與 Handler 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,如下載多個小圖。
相關文章
學習了 感謝您
回覆刪除學習了 感謝您
回覆刪除學習了 感謝您
回覆刪除學習了
回覆刪除