?
Dokumen ini menggunakan Manual laman web PHP Cina Lepaskan
AsyncTask
版本:Android 2.3 r1
?
結(jié)構(gòu)
繼承關系
public abstract class AsyncTask extends Object
????????
java.lang.Object
android.os.AsyncTask<Params, Progress, Result>
?
類概述
AsyncTask能夠適當?shù)亍⒑唵蔚赜糜?UI線程。 這個類不需要操作線程(Thread)就可以完成后臺操作將結(jié)果返回UI。
異步任務的定義是一個在后臺線程上運行,其結(jié)果是在 UI線程上發(fā)布的計算。 異步任務被定義成三種泛型類型: Params,Progress和 Result;和四個步驟: begin , doInBackground,processProgress 和end。
?
用法
???????? AysncTask必須被繼承使用。子類至少覆蓋一個方法 (doInBackground(Params...)),最經(jīng)常覆蓋另一個(onPostExecute(Result).)下面是一個子類的例子:
一旦創(chuàng)建,一個任務執(zhí)行起來就非常簡單:
?
AsyncTask的泛型類型
這三個類型被用于一個異步任務,如下:
1. Params,啟動任務執(zhí)行的輸入?yún)?shù)
2. Progress,后臺任務執(zhí)行的百分比
3. Result,后臺計算的結(jié)果類型
在一個異步任務里,不是所有的類型總被用。假如一個類型不被使用,可以簡單地使用 Void類型:
?
4個步驟
當一個異步任務被執(zhí)行,任務經(jīng)過四各步驟:
1.onPreExecute(),在UI線程上調(diào)用任務后立即執(zhí)行。這步通常被用于設置任務,例如在用戶界面顯示一個進度條。
2.doInBackground(Params...),后臺線程執(zhí)行onPreExecute()完后立即調(diào)用,這步被用于執(zhí)行較長時間的后臺計算。異步任務的參數(shù)也被傳到這步。計算的結(jié)果必須在這步返回,將傳回到上一步。在執(zhí)行過程中可以調(diào)用publishProgress(Progress...)來更新任務的進度。
3.onProgressUpdate(Progress...),一次呼叫 publishProgress(Progress...)后調(diào)用 UI線程。執(zhí)行時間是不確定的。這個方法用于當后臺計算還在進行時在用戶界面顯示進度。例如:這個方法可以被用于一個進度條動畫或在文本域顯示記錄。
4.onPostExecute(Result), 當后臺計算結(jié)束時,調(diào)用 UI線程。后臺計算結(jié)果作為一個參數(shù)傳遞到這步。
?
線程規(guī)則
有一些線程規(guī)則必須去遵守,這個類才會正確的工作:
·???????? 任務實例必須創(chuàng)建在 UI線程
·???????? execute(Params...)必須在 UI線程上調(diào)用
·???????? 不要手動調(diào)用onPreExecute(), onPostExecute(Result), doInBackground(Params...), onProgressUpdate(Progress...)
·???????? 這個任務只執(zhí)行一次(如果執(zhí)行第二次將會拋出異常)
?
內(nèi)部類
??? enum ????? AsyncTask.Status ?
表示任務的當前狀態(tài)
?
構(gòu)造函數(shù)
???????? public AsyncTask ()
創(chuàng)建一個新的異步任務。這個構(gòu)造函數(shù)必須在UI線程上調(diào)用。
?
公共方法
public final boolean cancel (boolean mayInterruptIfRunning)
嘗試取消這個任務的執(zhí)行,如果這個任務已經(jīng)結(jié)束或者已經(jīng)取消或者不能被取消或者某些其他原因,那么將導致這個操作失敗,當調(diào)用此方法時,此方法執(zhí)行成功并且這個任務還沒有執(zhí)行,那么此任務將不再執(zhí)行。如果任務已經(jīng)開始,這時執(zhí)行此操作傳入的參數(shù)mayInterruptIfRunning為true,執(zhí)行此任務的線程將嘗試中斷該任務。
參數(shù)
mayInterruptIfRunning? 如果為true則正在執(zhí)行的線程將會中斷,如果false,則會允許正在執(zhí)行的任務線程執(zhí)行完畢。
返回值
??? ?????????????????? 如果此任務不能取消返回false,如果已經(jīng)正常的執(zhí)行完畢,返回true
參見
???????? isCancelled()
???
onCancelled()
??????????????????
public final AsyncTask<Params, Progress, Result> execute (Params... params)
用指定的參數(shù)來執(zhí)行此任務,這個方法將會返回此任務本身,所以調(diào)用者可以擁有此任務的引用。此方法必須在UI線程中調(diào)用
參數(shù)
params ? 任務參數(shù)
返回值
AsyncTask的實例
異常
IllegalStateException?????? 如果getStatus()返回的是RUNNING或者FINISHED
?
public final Result get ()
等待計算結(jié)束并返回結(jié)果
返回值
計算結(jié)果
異常
CancellationException ?? 如果計算取消
ExecutionException ??????? 如果計算拋出異常
InterruptedException ??? 當?shù)却龝r當前線程拋出異常
?
public final Result get (long timeout, TimeUnit unit)
等待計算結(jié)束并返回結(jié)果,最長等待時間為:timeOut(超時時間).
參數(shù)
timeout 計算等待超時時間
unit ???????? 超時的時間單位
返回值
計算結(jié)果
異常
CancellationException ?? 如果計算取消
ExecutionException ??????? 如果計算拋出異常
InterruptedException ??? 當?shù)却龝r當前線程拋出異常
TimeoutException 等待時間超時
?
public final AsyncTask.Status getStatus ()
獲得任務的當前狀態(tài)
返回值
??? ???????? 當前狀態(tài)
?
public final boolean isCancelled ()
如果在任務正常結(jié)束之前取消任務成功則返回true,否則返回false
返回值
??????????????????????????? 如果任務正常結(jié)束之前取消任務成功返回true。
?????????????????? 參見
??????????????????????????? cancel(boolean)
?
受保護方法
???????? protected abstract Result doInBackground (Params... params)
覆蓋此方法在后臺線程執(zhí)行計算,此方法中的參數(shù)是此任務的execute(Params...)方法的調(diào)用這傳遞的參數(shù),此方法可以調(diào)用
publishProgress(Progress...)在
UI線程中來更新數(shù)據(jù)
參數(shù)
params ? 此任務的參數(shù)
返回值
返回一個由此任務子類定義的結(jié)果 Result
?????????????????? 參見
??? ?????????????????? onPreExecute()
??? ?????????????????? onPostExecute(Result)
??? ?????????????????? publishProgress(Progress...)
?
protected void onCancelled ()
此方法在UI線程中當cancel(boolean) 被調(diào)用后調(diào)用
參見
??? ?????????????????? cancel(boolean)
??? ?????????????????? isCancelled()
?
protected void onPostExecute (Result result)
此方法在UI線程中doInBackground(Params...)。方法調(diào)用之后調(diào)用,此方法中的參數(shù)的值是doInBackground(Params...)的返回值或者當此任務已經(jīng)被取消或有異常發(fā)生時此參數(shù)值為空
null
參數(shù)
result ???? 由doInBackground(Params...)計算出的操作的結(jié)果。
參見
onPreExecute()???
??? ?????????????????? doInBackground(Params...)
?
protected void onPreExecute ()
在方法doInBackground(Params...)調(diào)用之前調(diào)用
參見
??? ?????????????????? onPostExecute(Result)
?? ???????????????????? doInBackground(Params...)
?
protected void onProgressUpdate (Progress... values)
該方法在UI線程中publishProgress(Progress...)被調(diào)用之后調(diào)用,該方法中的參數(shù)
values是已經(jīng)被傳遞到
ppublishProgress(Progress...)中的參數(shù)
?????????????????? 參數(shù)
values ??? 進度表示值
參見
???
??????
publishProgress(Progress...)
??? ?????????????????? doInBackground(Params...)
?
protected final void publishProgress (Progress... values)
當調(diào)用doInBackground(Params...)在后臺執(zhí)行計算時會調(diào)用該方法,每當在UI線程中調(diào)用此方法時將觸發(fā)onProgressUpdate(Progress...)方法的執(zhí)行
參數(shù)
values ??? 將進度值更新到UI
參見
??? ?????????????????? onProgressUpdate(Progress...)
??? ?????????????????? doInBackground(Params...)
?
補充
???????? 文章精選
?????????????????? Android AsyncTask理解
?????????????????? TabActivity下在AsyncTask中使用ProgressDialog存在問題的解決方法
?????????????????? 小心,AsyncTask 不是萬能的 [blogspot]