1. 程式人生 > >Android之AsyncTask

Android之AsyncTask

AsyncTask,即非同步任務,是Android給我們提供的一個處理非同步任務的類.通過此類,可以實現UI執行緒和後臺執行緒進行通訊,後臺執行緒執行非同步任務,並把結果返回給UI執行緒.

.為什麼需要使用非同步任務?

我們知道,Android中只有UI執行緒,也就是主執行緒才能進行對UI的更新操作,而其他執行緒是不能直接操作UI的.這樣的好處是保證了UI的穩定性和準確性,避免多個執行緒同時對UI進行操作而造成UI的混亂.但Android是一個多執行緒的作業系統,我們總不能把所有的任務都放在主執行緒中進行實現,比如網路操作,檔案讀取等耗時操作,如果全部放到主執行緒去執行,就可能會造成後面任務的阻塞.Android會去檢測這種阻塞,當阻塞時間太長的時候,就會丟擲Application Not Responsed(ANR)錯誤.所以我們需要將這些耗時操作放在非主執行緒中去執行.這樣既避免了Android的單執行緒模型,又避免了ANR.

.AsyncTask為何而生?

提到非同步任務,我們能想到用執行緒,執行緒池去實現.確實,Android給我們提供了主執行緒與其他執行緒通訊的機制.但同時,Android也給我們提供了一個封裝好的元件--AsyncTask.利用AsyncTask,我們可以很方便的實現非同步任務處理.AsyncTask可以在子執行緒中更新UI,也封裝簡化了非同步操作.使用執行緒,執行緒池處理非同步任務涉及到了執行緒的同步,管理等問題.而且當執行緒結束的時候還需要使用Handler去通知主執行緒來更新UI.而AsyncTask封裝了這一切,使得我們可以很方便的在子執行緒中更新UI.

.構建AsyncTask子類的泛型引數

AsyncTask<Params,Progress,Result>是一個抽象類,通常用於被繼承.繼承AsyncTask需要指定如下三個泛型引數:

Params:啟動任務時輸入的引數型別.

Progress:後臺任務執行中返回進度值的型別.

Result:後臺任務執行完成後返回結果的型別.

.構建AsyncTask子類的回撥方法

AsyncTask主要有如下幾個方法:

doInBackground:必須重寫,非同步執行後臺執行緒要完成的任務,耗時操作將在此方法中完成.

onPreExecute:執行後臺耗時操作前被呼叫,通常用於進行初始化操作.

onPostExecute:當doInBackground方法完成後,系統將自動呼叫此方法,並將doInBackground方法返回的值傳入此方法.通過此方法進行UI的更新.

onProgressUpdate:當在doInBackground方法中呼叫publishProgress方法更新任務執行進度後,將呼叫此方法.通過此方法我們可以知曉任務的完成進度.