AsyncTask 類別
定義
重要
部分資訊涉及發行前產品,在發行之前可能會有大幅修改。 Microsoft 對此處提供的資訊,不做任何明確或隱含的瑕疵擔保。
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<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);
<h2>AsyncTask 的通用類型</h2>
非同步任務使用的三種類型如下:
<ol><li>Params,是執行時傳送給任務的參數類型。</li><li>Progress,背景計算期間發布的進度單元類型。</li><li>Result,背景計算結果的類型。</li></ol>
並非所有類型都被非同步任務使用。 要標記型別為未使用,只需使用以下型別 Void:
private class MyTask extends AsyncTask<Void, Void, Void> { ... }
<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 的並行工具 。
本頁部分內容為基於 Open Source Project 所創建與分享的作品,並依授權條款所描述的使用進行修改。
建構函式
| 名稱 | Description |
|---|---|
| AsyncTask() |
建立一個新的非同步任務。 |
| AsyncTask(IntPtr, JniHandleOwnership) |
用於建立 JNI 物件受管理表示的建構器;由執行時呼叫。 |
屬性
| 名稱 | Description |
|---|---|
| Class |
回傳此 |
| Handle |
底層 Android 實例的帳號。 (繼承來源 Object) |
| IsCancelled |
如果此任務在正常完成前被取消,則會回傳 |
| JniIdentityHashCode |
取得由互通執行時指派給此 Java 對等端的身份雜湊碼。 (繼承來源 Object) |
| JniManagedPeerState |
AsyncTask 旨在讓使用者介面執行緒能正確且輕鬆地使用。 (繼承來源 JavaObject) |
| JniPeerMembers |
提供此類型的 JNI 同儕成員元資料。 |
| PeerReference |
取得這個 Java 節點的 JNI 物件參考。 (繼承來源 Object) |
| SerialExecutor |
一個 |
| ThreadPoolExecutor |
一個 |
| 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[]) |
以指定參數執行任務。 |
| ExecuteOnExecutor(IExecutor, Object[]) |
以指定參數執行任務。 |
| Get() |
必要時等待計算完成,然後取回結果。 |
| Get(Int64, TimeUnit) |
如有需要,最多等待計算完成,然後取得結果。 |
| GetAsync() |
非同步執行相應的操作。 |
| GetAsync(Int64, TimeUnit) |
非同步執行相應的操作。 |
| GetHashCode() |
回傳物件的雜湊碼值。 (繼承來源 Object) |
| GetStatus() |
回傳此任務的當前狀態。 |
| JavaFinalize() |
已淘汰.
當垃圾回收判定該物件不再有相關參考時,由垃圾回收器呼叫。 (繼承來源 Object) |
| Notify() |
喚醒一個正在該物件監視器上等待的執行緒。 (繼承來源 Object) |
| NotifyAll() |
喚醒所有等待該物件監視器的執行緒。 (繼承來源 Object) |
| OnCancelled() |
應用程式最好能覆蓋 |
| OnCancelled(Object) |
在呼叫 |
| OnPostExecute(Object) |
在 之後的 UI 執行緒 |
| OnPreExecute() |
之前是在 UI 執行緒 |
| OnProgressUpdate(Object[]) |
在呼叫之後 |
| PublishProgress(Object[]) |
此方法可在背景運算仍在執行時,從 中 |
| 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) |
取得實例 |
| JavaAs<TResult>(IJavaPeerable) |
試著強制 |
| JavaCast<TResult>(IJavaObject) |
執行 Android 執行時檢查型別轉換。 |
| JavaCast<TResult>(IJavaObject) |
AsyncTask 旨在讓使用者介面執行緒能正確且輕鬆地使用。 |
| TryJavaCast<TResult>(IJavaPeerable, TResult) |
試著強制 |