1. 程式人生 > >AsyncTask的實現機制

AsyncTask的實現機制

如何正確選擇AsyncTask還是Handler?與Handler相比,AsyncTask消耗資源如何?是多執行緒嗎?先丟擲疑問。

一 AsyncTask是什麼:

1)Android為了降低非同步操作開發難度,結合Handler和執行緒池,提供了AsyncTask。AsyncTask就是一個封裝過的後臺任務類,非同步任務。他具有可以再後臺執行耗時操作,同時可以將執行進度與UI進行同步。

2)AsyncTask定義了三種泛型型別,Params,Progress、Result。

>Params啟動任務執行的輸入引數,比如http請求的url;

>Progress後臺任務執行的百分比;

>Progress後臺執行任務最終返回的結果,比如String。

3)AsyncTask常用方法

>doInBackground(Params...)後臺執行,比較耗時的操作都可以放在這裡進行。注意這裡不能直接操作UI。此方法在後臺程序中尅呼叫publicProgress(Progress...)來更新任務的進度。

>onPostExcute(Result)相當於Handler處理UI的方法,在這裡可以使用doInBackground得到結果處理操作UI。此方法在主執行緒中執行,任務執行的結果作為方法的引數返回;

>onProgressUpdate(Progress...)可以使用進度條增加使用者體驗,此方法在主執行緒執行,用於顯示任務執行進度;

>onPreExcute()這裡是終端使用者呼叫Excute時的介面,在任務執行之前開始呼叫此方法,可以再這裡顯示進度對話方塊;

>onCancelled()使用者呼叫取消時,要做的操作。

4)AsyncTask三種狀態

pending,running,finished

5)AsyncTask使用規則

>AsyncTask必須在主執行緒建立;

>execute()只能呼叫一次,也必須在主執行緒中執行;

>不要自己呼叫onPreExcute(),onPostExcute(),doInBackgound(),onProgressUpdate(),系統自己呼叫。

二AsyncTask與Handler對比

通過看原始碼,發現AsyncTask實際上就是一個執行緒池(包含了Handler ThreadPoolExecutor),所以AsyncTask比handler更耗資源,雖然AsyncTask在程式碼上比handler要輕量級別。而Handler僅僅就是傳送了一個訊息佇列,連執行緒都沒有開,他只是依附在建立的執行緒中。
但是,如果非同步任務的資料特別龐大,AsyncTask這種執行緒池結構的優勢就體現出來了。

所以,什麼時候使用AsyncTask,什麼時候使用Handler就非常明顯了。

>任務可以被終止,並需要不斷使用時,用AsyncTask;

>任務需要被多次重複執行,且與UI互動少時,用Handler。