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