本文發佈於個人博客html
此文章爲「譯文」,原文連接:www.mergeconflict.net/2012/05/jav…java
翻譯已獲原做者受權。水平有限,若有缺漏,懇請指正,謝謝~android
在 Android 開發中,有一個很是重要可是較少被討論到的問題:UI 的響應。這個問題一部分由 Android 系統自己決定,但更多時候是仍是開發者的責任。拋開其餘問題而言,解決 Android 應用 UI 響應問題的關鍵,就是儘量地讓大部分耗時工做轉移到後臺執行。衆所周知,將耗時任務或是 CPU 密集型任務放到後臺運行的方法,基本上只有兩個:網絡
Java Threadasync
Android 原生 AsyncTask
輔助類post
二者不必定能分出個孰優孰劣,所以瞭解他們各自的使用場景,對您的優化性能是有必定的好處的。性能
不須要下載大量數據的簡單網絡操做優化
I/O 密集型任務,耗時可能幾個毫秒以上ui
涉及中等或大量的網絡數據操做(包括上傳和下載).net
須要在後臺執行的 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()
方法區別不大
參看: