翻譯:
https://developer.android.com/reference/android/os/AsyncTask.html#doInBackground(Params...)
AsyncTask可以方便和簡單的使用UI線程。此類允許您執(zhí)行后臺(tái)操作并在UI線程上發(fā)布結(jié)果,而無需操作線程或者h(yuǎn)andlers。
AsyncTask被設(shè)計(jì)為圍繞Thread和Handler的輔助類,并不構(gòu)成通用的線程框架。理想情況下,AsyncTasks應(yīng)用于短操作(最多幾秒鐘)。如果需要長時(shí)間保持線程運(yùn)行,強(qiáng)烈建議您使用java.util.concurrent包提供的各種API,如Executor,ThreadPoolExecutor和FutureTask。
異步任務(wù)由在后臺(tái)線程上運(yùn)行并在UI線程上發(fā)布結(jié)果的計(jì)算定義。異步任務(wù)由3個(gè)通用類型(稱為Params,Progress和Result)以及4個(gè)步驟(稱為onPreExecute,doInBackground,onProgressUpdate和onPostExecute)定義。
AsyncTask必須被子類化才能使用。該子類將覆蓋至少一個(gè)方法(doInBackground(Params ...)),并且通常會(huì)覆蓋第二個(gè)(onPostExecute(Result))。
AsyncTask的通用類型
異步任務(wù)使用的三種類型如下:
- Params,在執(zhí)行時(shí)發(fā)送到任務(wù)的參數(shù)類型。
- Progress, 后臺(tái)程序運(yùn)行過程中發(fā)布的進(jìn)度單位類型。
- Result,后臺(tái)程序運(yùn)行結(jié)果的類型。
4步
當(dāng)執(zhí)行異步任務(wù)時(shí),任務(wù)將通過4個(gè)步驟:
- onPreExecute(),在任務(wù)執(zhí)行之前在UI線程上調(diào)用。此步驟通常用于設(shè)置任務(wù),例如在用戶界面中顯示進(jìn)度條。
- doInBackground(Params...),在onPreExecute()完成執(zhí)行后立即在后臺(tái)線程上調(diào)用。此步驟用于執(zhí)行可能需要很長時(shí)間的后臺(tái)計(jì)算。異步任務(wù)的參數(shù)傳遞給此步驟。計(jì)算結(jié)果必須由此步驟返回,并將被傳遞回最后一步。此步驟也可以使用publishProgress(Progress ...)發(fā)布一個(gè)或多個(gè)進(jìn)度單位。這些值在onProgressUpdate(Progress ...)步驟中的UI線程上發(fā)布。
- onProgressUpdate(Progress...),在調(diào)用publishProgress(Progress ...)后在UI線程上調(diào)用。執(zhí)行時(shí)間是不確定的。該方法用于在后臺(tái)程序仍在執(zhí)行時(shí)在用戶界面中顯示任何形式的進(jìn)度。例如,它可以用于對進(jìn)度條進(jìn)行動(dòng)畫處理或在文本字段中顯示日志。
- onPostExecute(Result),在后臺(tái)程序完成后在UI線程上調(diào)用。后臺(tái)程序的結(jié)果作為參數(shù)傳遞給該步驟。
取消任務(wù)
任何時(shí)候都可以通過調(diào)用cancel(boolean)來取消任務(wù)。調(diào)用此方法將導(dǎo)致接下來isCancelled()的調(diào)用返回true。調(diào)用此方法后,onCancelled(Object),而不是onPostExecute(Object)將在doInBackground(Object [])返回后被調(diào)用。為了盡快地取消任務(wù),您應(yīng)該始終從doInBackground(Object [])中定期檢查isCancelled()的返回值(比如在一個(gè)循環(huán)中)。
線程規(guī)則
這個(gè)類必須遵循一些線程規(guī)則才能正常工作:
必須在UI線程上加載AsyncTask類。這是從JELLY_BEAN自動(dòng)完成的。
必須在UI線程上創(chuàng)建任務(wù)實(shí)例。
必須在UI線程上調(diào)用execute(Params ...)。
不要手動(dòng)調(diào)用onPreExecute(),onPostExecute(Result),doInBackground(Params ...),onProgressUpdate(Progress ...)。
該任務(wù)只能執(zhí)行一次(如果嘗試第二次執(zhí)行,將拋出異常)。