語言

AsyncTask 類別

定義

AsyncTask 旨在讓使用者介面執行緒能正確且輕鬆地使用。

[Android.Runtime.Register("android/os/AsyncTask", DoNotGenerateAcw=true)]
[Java.Interop.JavaTypeParameters(new System.String[] { "Params", "Progress", "Result" })]
public abstract class AsyncTask : Java.Lang.Object
[<Android.Runtime.Register("android/os/AsyncTask", DoNotGenerateAcw=true)>]
[<Java.Interop.JavaTypeParameters(new System.String[] { "Params", "Progress", "Result" })>]
type AsyncTask = class
    inherit Object
繼承
衍生
屬性

備註

AsyncTask 旨在讓使用者介面執行緒能正確且輕鬆地使用。 然而,最常見的使用情境是整合進 UI,這會導致 Context 洩漏、錯過回調或設定變更時當機。 它在不同版本平台上行為不一致,會吞噬 的 doInBackground例外,且與直接使用 Executors 無太大實用價值。

AsyncTask 被設計為輔助ThreadHandler類別,並非通用執行緒框架。 AsyncTasks 理想上應該用於短時間操作(最多幾秒鐘)。如果你需要讓執行緒長時間運行,強烈建議使用套件 java.util.concurrent 中提供的各種 API,例如 Executor、 ThreadPoolExecutorFutureTask和 。

非同步任務是由在背景執行緒上執行的計算所定義,其結果會發佈在 UI 執行緒上。 非同步任務由三種通用類型定義,分別稱為Params、和ProgressResult,以及四個步驟,分別稱為onPreExecute、、doInBackgroundonProgressUpdate和onPostExecute。

<div class=“特殊參考”><h3>開發者指南</h3>

欲了解更多關於使用任務與執行緒的資訊,請閱讀 《程序與執行緒》 開發者指南。

</div>

<h2>使用率/<h2>

AsyncTask 必須被子類別化才能使用。 子類別會覆蓋至少一個方法(),#doInBackground且通常會覆蓋第二個方法(#onPostExecute)。

這裡有一個子職業化的範例:

private class DownloadFilesTask extends AsyncTask&lt;URL, Integer, Long&gt; {
                protected Long doInBackground(URL... urls) {
                    int count = urls.length;
                    long totalSize = 0;
                    for (int i = 0; i &lt; 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);

<h2>AsyncTask 的通用類型</h2>

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

<ol><li>Params,是執行時傳送給任務的參數類型。</li><li>Progress,背景計算期間發布的進度單元類型。</li><li>Result,背景計算結果的類型。</li></ol>

並非所有類型都被非同步任務使用。 要標記型別為未使用,只需使用以下型別 Void:

private class MyTask extends AsyncTask&lt;Void, Void, Void&gt; { ... }

<h2>四步</h2>

當執行非同步任務時,該任務會經歷四個步驟:

<ol><li>#onPreExecute(),在任務執行前會在 UI 執行緒中被調用。 此步驟通常用於設定任務,例如在使用者介面中顯示進度條。</li><li>#doInBackground 執行完畢後,立即 #onPreExecute() 在背景執行緒中被呼叫。 此步驟用於執行背景計算,可能需要較長時間。 非同步任務的參數會傳遞至此步驟。 計算結果必須由此步驟返回,並返回至上一步驟。 此步驟也 #publishProgress 可用於發布一個或多個進度單位。 這些值會發佈在 UI 執行緒的步驟中 #onProgressUpdate 。</li><li>#onProgressUpdate,在呼叫 #publishProgress. 後於 UI 執行緒中被呼叫。 執行的時間尚未明確。 此方法用於在背景運算仍在執行時,顯示使用者介面中任何形式的進度。 例如,它可以用來動畫進度條或顯示文字欄位中的日誌。</li><li>#onPostExecute,背景運算結束後在 UI 執行緒中被調用。 背景計算的結果會作為參數傳遞給此步驟。</li></ol>

<h2>取消任務</h2>

任務可隨時透過呼叫 #cancel(boolean)來取消。 呼叫此方法會使後續呼叫 #isCancelled() 回傳為真。 使用此方法後,#onCancelled(Object)#onPostExecute(Object)將 取代 ,則在返回後#doInBackground(Object[])被調用。 為了確保任務能盡快被取消,你應該盡可能定期從 中#isCancelled()檢查 的#doInBackground(Object[])回傳值(例如在迴圈中)。

<h2>執行緒規則</h2>

這個類別要正常運作,必須遵守幾條執行緒規則:

<ul><li>AsyncTask 類別必須載入在 UI 執行緒上。 此操作自 起android.os.Build.VERSION_CODES#JELLY_BEAN自動完成。</li><li>任務實例必須在 UI 執行緒中建立。</li><li 必須>#execute在 UI 執行緒中被調用。</li>li 不要手動叫<, >, #onPreExecute(),#onPostExecute#doInBackground#onProgressUpdate</li><li>任務只能執行一次(若嘗試第二次執行,則會拋出例外)。</li></ul>

<h2>記憶體可觀察性</h2>

AsyncTask 保證所有回調呼叫同步,以確保以下內容無需明確同步。

<ul>li 的記憶體效應,以及在呼叫 前<執行的其他任何事,包括 AsyncTask 物件的建構,都可見於 >。#onPreExecute#execute#doInBackground <李>的 #doInBackground 記憶效應可見於 #onPostExecute。 <LI>任何在呼叫 之前#doInBackground的#publishProgress記憶效應,對應#onProgressUpdate呼叫都會顯示。 (但 #doInBackground 仍然會持續運行,且需注意後續更新 #doInBackground 不會干擾進行中的 #onProgressUpdate 通話。) <LI>任何在呼叫 之前 #cancel 的記憶效應,會在呼叫 #isCancelled 後(返回為真)或在呼叫 #onCancelled的過程中及之後都可見。 </ul>

<h2>執行<順序/h2>

剛推出時,AsyncTasks 是在單一背景執行緒上串行執行。 從 開始 android.os.Build.VERSION_CODES#DONUT,改為一個執行緒池,允許多個任務並行運作。 從 開始 android.os.Build.VERSION_CODES#HONEYCOMB,任務會在單一執行緒上執行,以避免平行執行時常見的應用程式錯誤。

如果你真的想要平行執行,可以用 來調用#executeOnExecutor(java.util.concurrent.Executor, Object[])#THREAD_POOL_EXECUTOR。

此會員已被棄用。 改用標準 java.util.concurrent 或 Kotlin 的並行工具 。

Java 文件 android.os.AsyncTask。

本頁部分內容為基於 Open Source Project 所創建與分享的作品,並依授權條款所描述的使用進行修改。

建構函式

名稱 Description
AsyncTask()

建立一個新的非同步任務。

AsyncTask(IntPtr, JniHandleOwnership)

用於建立 JNI 物件受管理表示的建構器;由執行時呼叫。

屬性

名稱 Description
Class

回傳此 Object的執行時類別。

(繼承來源 Object)
Handle

底層 Android 實例的帳號。

(繼承來源 Object)
IsCancelled

如果此任務在正常完成前被取消,則會回傳 true 。

JniIdentityHashCode

取得由互通執行時指派給此 Java 對等端的身份雜湊碼。

(繼承來源 Object)
JniManagedPeerState

AsyncTask 旨在讓使用者介面執行緒能正確且輕鬆地使用。

(繼承來源 JavaObject)
JniPeerMembers

提供此類型的 JNI 同儕成員元資料。

PeerReference

取得這個 Java 節點的 JNI 物件參考。

(繼承來源 Object)
SerialExecutor

一個 Executor 一次執行一個任務、順序序列的。

ThreadPoolExecutor

一個 Executor 可以用來平行執行任務的

ThresholdClass

此 API 支援 Mono for Android 基礎架構,並非直接從你的程式碼中使用。

ThresholdType

此 API 支援 Mono for Android 基礎架構,並非直接從你的程式碼中使用。

方法

名稱 Description
Cancel(Boolean)

試圖取消執行此任務。

Clone()

建立並回傳此物件的副本。

(繼承來源 Object)
Construct(JniObjectReference, JniObjectReferenceOptions)

AsyncTask 旨在讓使用者介面執行緒能正確且輕鬆地使用。

(繼承來源 JavaObject)
Dispose()

釋放該 Java 節點所持有的資源。

(繼承來源 Object)
Dispose(Boolean)

釋放該 Java 節點所持有的資源。

(繼承來源 Object)
DisposeUnlessReferenced()

AsyncTask 旨在讓使用者介面執行緒能正確且輕鬆地使用。

(繼承來源 JavaObject)
DoInBackground(Object[])

覆寫此方法,對背景執行緒執行計算。

Equals(Object)

AsyncTask 旨在讓使用者介面執行緒能正確且輕鬆地使用。

(繼承來源 JavaObject)
Equals(Object)

表示是否有其他物體「等同」於此物。

(繼承來源 Object)
Execute(IRunnable)

方便版 #execute(Object...) ,用於簡單可跑物件。

Execute(Object[])

以指定參數執行任務。

ExecuteOnExecutor(IExecutor, Object[])

以指定參數執行任務。

Get()

必要時等待計算完成,然後取回結果。

Get(Int64, TimeUnit)

如有需要,最多等待計算完成,然後取得結果。

GetAsync()

非同步執行相應的操作。

GetAsync(Int64, TimeUnit)

非同步執行相應的操作。

GetHashCode()

回傳物件的雜湊碼值。

(繼承來源 Object)
GetStatus()

回傳此任務的當前狀態。

JavaFinalize()
已淘汰.

當垃圾回收判定該物件不再有相關參考時,由垃圾回收器呼叫。

(繼承來源 Object)
Notify()

喚醒一個正在該物件監視器上等待的執行緒。

(繼承來源 Object)
NotifyAll()

喚醒所有等待該物件監視器的執行緒。

(繼承來源 Object)
OnCancelled()

應用程式最好能覆蓋 #onCancelled(Object)。

OnCancelled(Object)

在呼叫#cancel(boolean)完成後,會在 UI 執行緒#doInBackground(Object[])執行。

OnPostExecute(Object)

在 之後的 UI 執行緒 #doInBackground執行。

OnPreExecute()

之前是在 UI 執行緒 #doInBackground上執行的。

OnProgressUpdate(Object[])

在呼叫之後 #publishProgress ,會在 UI 執行緒執行。

PublishProgress(Object[])

此方法可在背景運算仍在執行時,從 中 #doInBackground 調用以發布 UI 執行緒的更新。

SetHandle(IntPtr, JniHandleOwnership)

設定 Handle 屬性。

(繼承來源 Object)
SetPeerReference(JniObjectReference, JniObjectReferenceOptions)

AsyncTask 旨在讓使用者介面執行緒能正確且輕鬆地使用。

(繼承來源 JavaObject)
ToArray<T>()

從這個 Java 陣列包裝器建立一個受管理陣列。

(繼承來源 Object)
ToString()

回傳物件的字串表示。

(繼承來源 Object)
UnregisterFromRuntime()

將此 Java 節點從互通執行時中取消註冊。

(繼承來源 Object)
Wait()

導致目前執行緒等待被喚醒,通常是透過 <em>通知</><em 或 em>中斷</em> 來喚醒。

(繼承來源 Object)
Wait(Int64, Int32)

會讓目前執行緒等待喚醒,通常是透過 <em>通知</><em 或 em>中斷</em>,或是經過一定的真實時間。

(繼承來源 Object)
Wait(Int64)

會讓目前執行緒等待喚醒,通常是透過 <em>通知</><em 或 em>中斷</em>,或是經過一定的真實時間。

(繼承來源 Object)

明確介面實作

名稱 Description
IJavaPeerable.Disposed()

AsyncTask 旨在讓使用者介面執行緒能正確且輕鬆地使用。

(繼承來源 JavaObject)
IJavaPeerable.Finalized()

AsyncTask 旨在讓使用者介面執行緒能正確且輕鬆地使用。

(繼承來源 JavaObject)
IJavaPeerable.JniObjectReferenceControlBlock

AsyncTask 旨在讓使用者介面執行緒能正確且輕鬆地使用。

(繼承來源 JavaObject)
IJavaPeerable.SetJniIdentityHashCode(Int32)

AsyncTask 旨在讓使用者介面執行緒能正確且輕鬆地使用。

(繼承來源 JavaObject)
IJavaPeerable.SetJniManagedPeerState(JniManagedPeerStates)

AsyncTask 旨在讓使用者介面執行緒能正確且輕鬆地使用。

(繼承來源 JavaObject)
IJavaPeerable.SetPeerReference(JniObjectReference)

AsyncTask 旨在讓使用者介面執行緒能正確且輕鬆地使用。

(繼承來源 JavaObject)

擴充方法

名稱 Description
GetJniTypeName(IJavaPeerable)

取得實例 self類型的 JNI 名稱。

JavaAs<TResult>(IJavaPeerable)

試著強制self輸入 TResult,檢查 強制在 Java 端是否有效。

JavaCast<TResult>(IJavaObject)

執行 Android 執行時檢查型別轉換。

JavaCast<TResult>(IJavaObject)

AsyncTask 旨在讓使用者介面執行緒能正確且輕鬆地使用。

TryJavaCast<TResult>(IJavaPeerable, TResult)

試著強制self輸入 TResult,檢查 強制在 Java 端是否有效。

適用於