AsyncTask

翻譯:
  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ù)使用的三種類型如下:

  1. Params,在執(zhí)行時(shí)發(fā)送到任務(wù)的參數(shù)類型。
  2. Progress, 后臺(tái)程序運(yùn)行過程中發(fā)布的進(jìn)度單位類型。
  3. Result,后臺(tái)程序運(yùn)行結(jié)果的類型。

4步
當(dāng)執(zhí)行異步任務(wù)時(shí),任務(wù)將通過4個(gè)步驟:

  1. onPreExecute(),在任務(wù)執(zhí)行之前在UI線程上調(diào)用。此步驟通常用于設(shè)置任務(wù),例如在用戶界面中顯示進(jìn)度條。
  2. 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ā)布。
  3. onProgressUpdate(Progress...),在調(diào)用publishProgress(Progress ...)后在UI線程上調(diào)用。執(zhí)行時(shí)間是不確定的。該方法用于在后臺(tái)程序仍在執(zhí)行時(shí)在用戶界面中顯示任何形式的進(jìn)度。例如,它可以用于對進(jìn)度條進(jìn)行動(dòng)畫處理或在文本字段中顯示日志。
  4. 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í)行,將拋出異常)。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Android開發(fā)者:你真的會(huì)用AsyncTask嗎? 導(dǎo)讀.1 在Android應(yīng)用開發(fā)中,我們需要時(shí)刻注意保證...
    cxm11閱讀 2,778評論 0 29
  • Android Handler機(jī)制系列文章整體內(nèi)容如下: Android Handler機(jī)制1之ThreadAnd...
    隔壁老李頭閱讀 3,435評論 1 15
  • 在Android中我們可以通過Thread+Handler實(shí)現(xiàn)多線程通信,一種經(jīng)典的使用場景是:在新線程中進(jìn)行耗時(shí)...
    呂侯爺閱讀 2,183評論 2 23
  • 由于Android的特性,如果要執(zhí)行耗時(shí)操作,則必須方法子線程中執(zhí)行。除了Thread可以開啟子線程外,Andro...
    Ruheng閱讀 26,049評論 6 18
  • 每逢佳節(jié)倍虐狗 當(dāng)今社會(huì)的男女情侶的情人節(jié),已經(jīng)普及到了任何一個(gè)節(jié)假日中! 這讓無數(shù)的單身汪受到了數(shù)萬點(diǎn)傷害,只要...
    認(rèn)識世界閱讀 312評論 2 0

友情鏈接更多精彩內(nèi)容