Google is committed to advancing racial equity for Black communities. See how.
本頁面由 Cloud Translation API 翻譯而成。
Switch to English

異步任務

公共抽像類AsyncTask擴展Object
已知的直接子類

AsyncTask支持正確且輕鬆地使用UI線程。此類允許執行後台操作並在UI線程上發布結果,而無需操縱線程和/或處理程序。

AsyncTask被設計為圍繞ThreadHandler的幫助器類,並且不構成通用的線程框架。理想情況下,應將AsyncTasks用於較短的操作(最多幾秒鐘)。如果需要使線程長時間運行,則強烈建議您使用java.util.concurrent包提供的各種API,例如ExecutorThreadPoolExecutorFutureTask

異步任務由在後台線程上運行的計算定義,並且其結果發佈在UI線程上。異步任務由3個通用類型(稱為ParamsProgressResult )以及4個步驟(分別稱為onPreExecutedoInBackgroundonProgressUpdateonPostExecute

開發人員指南

有關使用任務和線程的更多信息,請閱讀《 進程和線程》開發人員指南。

用法

必須將AsyncTask子類化才能使用。子類將重寫至少一個方法( doInBackground(Params...) ),並且通常將重寫第二個方法( onPostExecute(Result) 。)

這是子類化的示例:

        private class DownloadFilesTask extends AsyncTask<URL, Integer, Long> {
        protected Long doInBackground(URL... urls) {
        int count = urls.length;
        long totalSize = 0;
        for (int i = 0; i < count; i++) {
        totalSize += Downloader.downloadFile(urls[i]);
        publishProgress((int) ((i / (float) count) * 100));
        // Escape early if cancel() is called
        if (isCancelled()) break;
        }
        return totalSize;
        }
        protected void onProgressUpdate(Integer... progress) {
        setProgressPercent(progress[0]);
        }
        protected void onPostExecute(Long result) {
        showDialog("Downloaded " + result + " bytes");
        }
        }
        

創建完成後,任務將非常簡單地執行:

        new DownloadFilesTask().execute(url1, url2, url3);
        

AsyncTask的通用類型

異步任務使用的三種類型如下:

  1. Params ,執行時發送給任務的參數類型。
  2. Progress ,後台計算期間發布的進度單位的類型。
  3. Result ,背景計算Result的類型。

並非所有類型都總是由異步任務使用。要將類型標記為未使用,只需使用Void類型:

        private class MyTask extends AsyncTask<Void, Void, Void> { ... }
        

4個步驟

當執行異步任務時,該任務將經歷4個步驟:

  1. onPreExecute() ,在執行任務之前在UI線程上調用。此步驟通常用於設置任務,例如,通過在用戶界面中顯示進度欄。
  2. doInBackground(Params...) ,在onPreExecute()完成執行後立即在後台線程上調用。此步驟用於執行可能需要很長時間的後台計算。異步任務的參數將傳遞到此步驟。計算結果必須通過此步驟返回,並將傳遞回最後一步。此步驟還可以使用publishProgress(Progress...)發布一個或多個進度單位。這些值在onProgressUpdate(Progress...)步驟中發佈在UI線程上。
  3. onProgressUpdate(Progress...) ,在調用publishProgress(Progress...)之後在UI線程上調用。執行時間未定義。此方法用於在後台計算仍在執行時在用戶界面中顯示任何形式的進度。例如,它可用於為進度欄設置動畫或在文本字段中顯示日誌。
  4. onPostExecute(Result) ,在後台計算完成後在UI線程上調用。後台計算的結果作為參數傳遞到此步驟。

取消任務

可以通過調用cancel(boolean)任務。調用此方法將導致對isCancelled()後續調用返回true。調用此方法後, onCancelled(Object) ,而不是onPostExecute(Object)之後將被調用doInBackground(Object[])的回報。為了確保盡快取消任務,如果可能的話(例如在循環內doInBackground(Object[]) ,應始終定期從doInBackground(Object[])檢查isCancelled()的返回值。

穿線規則

為了使此類正常工作,必須遵循一些線程規則:

記憶可觀察性

AsyncTask保證所有回調調用都以這樣的方式進行同步:在沒有顯式同步的情況下,以下操作是安全的。

執行順序

首次引入時,AsyncTasks在單個後台線程上串行執行。從DONUT開始,它已更改為線程池,允許多個任務並行運行。從HONEYCOMB開始,任務在單個線程上執行,以避免並行執行引起的常見應用程序錯誤。

如果您確實想要並行執行,則可以使用THREAD_POOL_EXECUTOR調用executeOnExecutor(java.util.concurrent.Executor, Object[])

嵌套類摘要

枚舉 AsyncTask.Status 指示任務的當前狀態。

領域摘要

公共靜態最終執行人 SERIAL_EXECUTOR Executor ,按順序一次執行一個任務。
公共靜態最終執行人 THREAD_POOL_EXECUTOR 一個Executor ,可用於並行執行任務。

公共建設者摘要

AsyncTask ()
創建一個新的異步任務。

公開方法摘要

最終布爾值
取消 (布爾值mayInterruptIfRunning)

嘗試取消執行此任務。

最後的AsyncTask <參數,進度,結果>
執行 (參數...參數)
使用指定的參數執行任務。
靜態空隙
執行 (可運行,可運行)
與簡單的Runnable對像一起使用的execute(Object)便捷版本。
最後的AsyncTask <參數,進度,結果>
executeOnExecutor (Executor exec,Params ... params)
使用指定的參數執行任務。
最後結果
獲取 (長超時,TimeUnit單位)
必要時最多等待給定時間以完成計算,然後檢索其結果。
最後結果
得到 ()
等待必要的計算完成,然後檢索其結果。
最後的AsyncTask.Status
getStatus ()
返回此任務的當前狀態。
最終布爾值
isCancelled ()
如果此任務在正常完成之前被取消,則返回true

保護方法摘要

抽象結果
doInBackground (參數...參數)
重寫此方法以在後台線程上執行計算。
虛空
onCancelled ()

應用程序最好應重寫onCancelled(Object)

虛空
onCancelled (結果結果)

在調用cancel(boolean)doInBackground(Object[])完成之後,在UI線程上運行。

虛空
onPostExecute (結果結果)

doInBackground(Params...)之後在UI線程上運行。

虛空
onPreExecute ()
doInBackground(Params...)之前的UI線程上運行。
虛空
onProgressUpdate (進度...值)
在調用publishProgress(Progress...)之後在UI線程上運行。
最後的空白
publishProgress (進度...值)
可以從doInBackground(Params...)調用此方法,以在後台計算仍在運行時在UI線程上發布更新。

繼承的方法摘要

領域

公共靜態最終執行者 SERIAL_EXECUTOR

Executor ,按順序一次執行一個任務。此序列化對於特定過程是全局的。

公共靜態最終執行者 THREAD_POOL_EXECUTOR

一個Executor ,可用於並行執行任務。

公共建設者

公共 AsyncTask ()

創建一個新的異步任務。必須在UI線程上調用此構造函數。

公開方法

public final布爾 取消 (boolean mayInterruptIfRunning)

嘗試取消執行此任務。如果任務已經完成,已經被取消或由於某些其他原因而無法取消,則此嘗試將失敗。如果成功,並且在調用cancel時此任務尚未啟動,則該任務永遠不要運行。如果任務已經開始,則mayInterruptIfRunning參數確定是否應中斷執行該任務的線程以嘗試停止該任務。

調用此方法會導致onCancelled(Object)被後在UI線程上調用doInBackground(Object[])的回報。調用此方法可確保永遠不會調用onPostExecute(Object) 。調用此方法後,應定期從doInBackground(Object[])檢查isCancelled()返回的值,以isCancelled()完成任務。

參量
mayInterruptIfRunning 如果應該中斷執行此任務的線程,則為true;否則為false 。否則,將允許正在進行的任務完成。
退貨
  • 如果無法取消任務,則返回false ,通常是因為它已經正常完成了;否則為

公共最終AsyncTask <Params,Progress,Result> 執行 (Params ... params)

使用指定的參數執行任務。任務返回自身(this),以便調用者可以保留對其的引用。

注意:此函數根據平台版本在單個後台線程或線程池的隊列中調度任務。首次引入時,AsyncTasks在單個後台線程上串行執行。從DONUT開始,它已更改為線程池,允許多個任務並行運行。從HONEYCOMB開始,任務將返回到在單個線程上執行,以避免由並行執行引起的常見應用程序錯誤。如果您確實想要並行執行,則可以將此方法的executeOnExecutor(Executor, Params...)版本與THREAD_POOL_EXECUTOR ;但是,請參閱此處的註釋以獲取有關其使用的警告。

必須在UI線程上調用此方法。

參量
參數任務的參數。
退貨
  • 此AsyncTask實例。
投擲
IllegalStateException 如果getStatus()返回RUNNINGFINISHED

公共靜態無效 執行 (Runnable runnable)

與簡單的Runnable對像一起使用的execute(Object)便捷版本。有關execute(Object[])順序的更多信息,請參見execute(Object[])

參量
可運行的

公共最終AsyncTask <Params,Progress,Result> executeOnExecutor (Executor exec,Params ... params)

使用指定的參數執行任務。任務返回自身(this),以便調用者可以保留對其的引用。

此方法通常與THREAD_POOL_EXECUTOR一起使用,以允許多個任務在AsyncTask管理的線程池上並行運行,但是您也可以將自己的Executor用於自定義行為。

警告:通常並不需要從線程池中並行運行多個任務,因為未定義其操作順序。例如,如果使用這些任務來共同修改任何狀態(例如,由於單擊按鈕而寫入文件),則不能保證修改的順序。如果不進行仔細的工作,在極少數情況下,較新版本的數據可能會被較舊的版本覆蓋,從而導致模糊的數據丟失和穩定性問題。最好以串行方式執行此類更改;為了確保不管平台版本如何都可以對這些工作進行序列化,可以將此功能與SERIAL_EXECUTOR

必須在UI線程上調用此方法。

參量
執行執行者使用。 THREAD_POOL_EXECUTOR可用作鬆散耦合的任務的便捷的進程範圍的線程池。
參數任務的參數。
退貨
  • 此AsyncTask實例。
投擲
IllegalStateException 如果getStatus()返回RUNNINGFINISHED
也可以看看

公共最終結果 get (長時間超時,TimeUnit單位)

必要時最多等待給定時間以完成計算,然後檢索其結果。

參量
超時取消操作之前需要等待的時間。
單元超時的時間單位。
退貨
  • 計算結果。
投擲
CancellationException 如果計算被取消。
ExecutionException 如果計算拋出異常。
InterruptedException 如果當前線程在等待時被中斷。
TimeoutException 如果等待超時。

公開最終結果 get ()

等待必要的計算完成,然後檢索其結果。

退貨
  • 計算結果。
投擲
CancellationException 如果計算被取消。
ExecutionException 如果計算拋出異常。
InterruptedException 如果當前線程在等待時被中斷。

公共最終AsyncTask.Status getStatus ()

返回此任務的當前狀態。

退貨
  • 當前狀態。

公共最終布爾值 isCancelled ()

如果此任務在正常完成之前被取消,則返回true 。如果要在任務上調用cancel(boolean) ,則應定期從doInBackground(Object[])檢查此方法返回的值,以盡快結束任務。

退貨
  • 如果任務在完成之前被取消,則為true
也可以看看

受保護的方法

受保護的抽象結果 doInBackground (Params ... params)

重寫此方法以在後台線程上執行計算。指定的參數是此任務的調用者傳遞給execute(Params...)execute(Params...) 。此方法可以調用publishProgress(Progress...)在UI線程上發布更新。

參量
參數任務的參數。
退貨
  • 結果,由此任務的子類定義。

onCancelled ()上 受保護的void

應用程序最好應重寫onCancelled(Object) 。此方法由onCancelled(Object)的默認實現調用。

在調用cancel(boolean)doInBackground(Object[])完成之後,在UI線程上運行。

onCancelled 受保護的無效 (結果結果)

在調用cancel(boolean)doInBackground(Object[])完成之後,在UI線程上運行。

默認實現只是調用onCancelled()而忽略結果。如果您編寫自己的實現,請不要調用super.onCancelled(result)

參量
結果doInBackground(Object[])計算的結果(如果有doInBackground(Object[])可以為null

受保護的void onPostExecute (結果結果)

doInBackground(Params...)之後在UI線程上運行。指定的結果是doInBackground(Params...)返回的值。

如果任務已取消,則不會調用此方法。

參量
結果doInBackground(Params...)計算的運算結果。

受保護的void onPreExecute ()

doInBackground(Params...)之前的UI線程上運行。

受保護的void onProgressUpdate (進度...值)

在調用publishProgress(Progress...)之後在UI線程上運行。指定的值是傳遞給publishProgress(Progress...)

參量
價值觀指示進度的值。

受保護的最終無效 publishProgress (進度...值)

可以從doInBackground(Params...)調用此方法,以在後台計算仍在運行時在UI線程上發布更新。每次對此方法的調用都會觸發UI線程上onProgressUpdate(Progress...)的執行。如果任務已取消, onProgressUpdate(Progress...)將被調用。

參量
價值觀用於更新UI的進度值。