異步任務類的五種方法

AsyncTask(異步任務類)出現的原因
在開發Android應用時必須遵守單線程模型的原則: Android UI操作並不是線程安全的並且這些操作必須在UI線程中執行。如果在非UI線程中直接操作UI線程,會拋出異常android.view.ViewRoot$CalledFromWrongThreadException: Only the original threadthat created a view hierarchy can touch its views,這與普通的java程序不同。
主線程成不能執行耗時操作,子線程不能修改UI:android共提供了5種解決方案供我們選擇:
1) 使用Handler消息機制。子線程負責耗時操作,當需要修改UI時,發送Message讓主線程幫組修改UI。
2) 在子線程中調用任何的View對象的post(Runnable)或postDelay(Runnable, tlong)方法,則Runnable中run方法的代碼會在主線程中運行。(非主流,實際開發中使用不多)
3) 在子線程中調用Activity的runOnUiThread(Runnalbe)方法,則Runnable對象的run()方法內的代碼會嵌入到主線程運行。(非主流,實際開發中使用不多)
4) 使用AsyncTask異步任務。(重點)
5) 使用Loader。
AsyncTask異步任務實現
在單擊事件中new對一個實現AsyncTask該類的方法.execute(地址);
編輯一個類繼承AsyncTask抽象類 在該類中各個參數的解釋
Params:執行異步任務傳遞進來的地址參數類型
Progress:進度類型
Result:獲取最終異步任務下載的結果類型 如: Bitmap:圖片類型(Bitmap)
上面三個參數各個在方法中使用分別如下:
第一個泛型,在doInBackground()方法中使用:獲取網絡地址的字符串
第二個泛型:在onProgressUpdate()方法中使用;運行並解析第一個參數傳值過來字符串
第三個泛型:在onPostExecute()方法中使用:把值在控件上顯示在該方法中實現
String…:可變長度的字符串數組
params:傳遞過來的地址,是由第一個泛型決定
返回值類型:最終耗時操作的結果,是由第三個泛型決定

四個步驟

當我們執行一個異步任務的時候,其需要按照下面的4個步驟分別執行。
步驟一:
onPreExecute(): 這個方法是在執行異步任務之前的時候執行,並且是在UI Thread當中執行的,通常我們在這個方法裏做一些UI控件的初始化的操作,例如彈出要給用戶提示的ProgressDialog。
步驟二:
doInBackground(Params… params): 在onPreExecute()方法執行完之後,會馬上執行這個方法,這個方法就是來處理異步任務的方法,Android操作系統會在後臺的線程池當中開啓一個worker thread(子線程)來執行我們的這個方法,所以這個方法是在worker thread當中執行的,在這個方法裏,我們可以從網絡當中獲取數據等一些耗時的操作。這個方法執行完之後就可以將我們的執行結果發送給我們的最後一個 onPostExecute 方法。注意:此方法不是 UI線程中執行。
步驟三:
onProgressUpdate(Progess… values):這個方法也是在UI Thread當中執行的,我們在異步任務執行的時候,有時候需要將正在執行的進度返回給我們的UI界面,例如下載一張網絡圖片,我們需要時刻顯示其下載的進 度,就可以使用這個方法來更新我們的進度。這個方法在調用之前,我們需要在doInBackground 方法中調用一個publishProgress(Progress) 的方法來將我們的進度時時刻刻傳遞給 onProgressUpdate 方法來更新。
步驟四:
onPostExecute(Result… result):當我們的異步任務執行完之後,就會將結果返回給這個方法,這個方法也是在UIThread當中調用的,我們可以將返回的結果顯示在UI控件上。

總結:以上4個方法中doInBackground是在workThread線程中執行,其餘3個方法均是在UI(main)線程中執行。爲什麼我們的AsyncTask抽象類只有一個 doInBackground 的抽象方法呢??原因是,我們如果要做一個異步任務,我們必須要爲其開闢一個新的Thread,讓其完成一些操作,而在完成這個異步任務時,我可能並不需要彈出要給用戶提示的ProgressDialog,我們可能並不需要隨時更新我的ProgressDialog的進度條,我也可能並不需要將結果更新給我們的UI界面,所以除了 doInBackground 方法之外的三個方法,都不是必須有的,因此我們必須要實現的方法是 doInBackground 方法。
下面是示意圖:
這裏寫圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章