本文釋出於我的部落格
此文章為「譯文」,原文連結:www.mergeconflict.net/2012/05/jav…
翻譯已獲原作者授權。水平有限,如有缺漏,懇請指正,謝謝~
前言
在 Android 開發中,有一個非常重要但是較少被討論到的問題:UI 的響應。這個問題一部分由 Android 系統本身決定,但更多時候是還是開發者的責任。拋開其他問題而言,解決 Android 應用 UI 響應問題的關鍵,就是儘可能地讓大部分耗時工作轉移到後臺執行。眾所周知,將耗時任務或是 CPU 密集型任務放到後臺執行的方法,基本上只有兩個:
Java Thread
Android 原生
AsyncTask
輔助類
兩者不一定能分出個孰優孰劣,因此瞭解他們各自的使用場景,對您的優化效能是有一定的好處的。
AsyncTask 的使用場景
不需要下載大量資料的簡單網路操作
I/O 密集型任務,耗時可能幾個毫秒以上
Java Thread 使用場景
涉及中等或大量的網路資料操作(包括上傳和下載)
需要在後臺執行的 CPU 密集型任務
當你想要在 UI 執行緒控制 CPU 佔用率時
還有一個老生常談的問題就是,千萬不要在 UI 執行緒(主執行緒)執行網路操作。你需要使用上述兩種方式之一來訪問網路。
關鍵點
Java Thread 和 AsyncTask
最關鍵的不同點在於,AsyncTask
執行在 GUI 執行緒¹ 上,所以繁重的 CPU 任務都可能導致 UI 響應性下降。Java Thread 可以擁有不同的執行緒優先順序,使用低優先順序的執行緒來完成非實時運算任務能夠很好地為 GUI 操作釋放 CPU 時間。這是提高 GUI 響應性的關鍵點之一。
然而,正如很多 Android 開發者所瞭解的,你無法在後臺執行緒更新 UI 元件,不然就會丟擲異常。這對於 AsyncTask
來說並不是什麼大事² ,但是當你使用的是 Java Thread,那麼你必須在你操作結束的時候使用post()
來更新 UI³ 。
譯者按原文查詢資料注:
AsyncTask
必須在主執行緒載入,其中除了doInBackground(Object [])
方法外,其餘三個方法都在 UI 執行緒執行基於第一點,
AsyncTask
可以在其餘三個方法中更新 UI 元件可以使用
view.post()
方法來更新 UI 元件,這個方法和使用Activity.runOnUiThread()
方法區別不大
參看: