天天看點

Android應用開發—AsyncTask

摘錄自 Android 多線程—–AsyncTask詳解

AsyncTask

  • AsyncTask:異步任務,從字面上來說,就是在我們的UI主線程運作的時候,異步的完成一些操作。AsyncTask允許我們的執行一個異步的任務在背景。我們可以将耗時的操作放在異步任務當中來執行,并随時将任務執行的結果傳回給我們的UI線程來更新我們的UI控件。通過AsyncTask我們可以輕松的解決多線程之間的通信問題。
  • 怎麼來了解AsyncTask呢?通俗一點來說,AsyncTask就相當于Android給我們提供了一個多線程程式設計的一個架構,其介于Thread和Handler之間,我們如果要定義一個AsyncTask,就需要定義一個類來繼承AsyncTask這個抽象類,并實作其唯一的一個 doInBackgroud 抽象方法。要掌握AsyncTask,我們就必須要一個概念,總結起來就是: 3個泛型,4個步驟。
  • 3個泛型指的是什麼呢?我們來看看AsyncTask這個抽象類的定義,當我們定義一個類來繼承AsyncTask這個類的時候,我們需要為其指定3個泛型參數:
AsyncTask <Params, Progress, Result>
Params: 這個泛型指定的是我們傳遞給異步任務執行時的參數的類型
Progress: 這個泛型指定的是我們的異步任務在執行的時候将執行的進度傳回給UI線程的參數的類型
Result: 這個泛型指定的異步任務執行完後傳回給UI線程的結果的類型
 我們在定義一個類繼承AsyncTask類的時候,必須要指定好這三個泛型的類型,如果都不指定的話,則都将其寫成Void,
例如:
AsyncTask <Void, Void, Void>           
  • 4個步驟:當我們執行一個異步任務的時候,其需要按照下面的4個步驟分别執行
    • onPreExecute():

      這個方法是在執行異步任務之前的時候執行,并且是在UI Thread當中執行的,通常我們在這個方法裡做一些UI控件的初始化的操作,例如彈出要給ProgressDialog

    • doInBackground(Params… params): 在onPreExecute()方法執行完之後,會馬上執行這個方法,這個方法就是來處理異步任務的方法,Android作業系統會在背景的線程池當中開啟一個worker thread來執行我們的這個方法,是以這個方法是在worker thread當中執行的,這個方法執行完之後就可以将我們的執行結果發送給我們的最後一個 onPostExecute 方法,在這個方法裡,我們可以從網絡當中擷取資料等一些耗時的操作
    • onProgressUpdate(Progess… values): 這個方法也是在UI Thread當中執行的,我們在異步任務執行的時候,有時候需要将執行的進度傳回給我們的UI界面,例如下載下傳一張網絡圖檔,我們需要時刻顯示其下載下傳的進度,就可以使用這個方法來更新我們的進度。這個方法在調用之前,我們需要在 doInBackground 方法中調用一個 publishProgress(Progress) 的方法來将我們的進度時時刻刻傳遞給 onProgressUpdate 方法來更新
    • onPostExecute(Result… result): 當我們的異步任務執行完之後,就會将結果傳回給這個方法,這個方法也是在UI Thread當中調用的,我們可以将傳回的結果顯示在UI控件上
    為什麼我們的AsyncTask抽象類隻有一個 doInBackground 的抽象方法呢??原因是,我們如果要做一個異步任務,我們必須要為其開辟一個新的Thread,讓其完成一些操作,而在完成這個異步任務時,我可能并不需要彈出要給ProgressDialog,我并不需要随時更新我的ProgressDialog的進度條,我也并不需要将結果更新給我們的UI界面,是以除了 doInBackground 方法之外的三個方法,都不是必須有的,是以我們必須要實作的方法是 doInBackground 方法。

繼續閱讀