AsyncTask 類別
定義
重要
部分資訊涉及發行前產品,在發行之前可能會有大幅修改。 Microsoft 對此處提供的資訊,不做任何明確或隱含的瑕疵擔保。
AsyncTask 旨在啟用適當且容易使用的 UI 執行緒。
[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 執行緒。 不過,最常見的使用案例是整合至 UI,這會導致內容外泄、遺漏回呼,或在組態變更時當機。 它在不同版本的平臺上也有不一致的行為,會抑制 的 doInBackground
例外狀況,而且不會直接使用 Executor
提供太多公用程式。
AsyncTask 的設計目的是要作為協助程式類別, Thread
而且 Handler
不會構成泛型執行緒架構。 AsyncTasks 最好用於簡短作業, (最多幾秒鐘。) 如果您需要讓執行緒長時間執行,強烈建議您使用封裝所提供的 java.util.concurrent
各種 API,例如 Executor
、 ThreadPoolExecutor
和 FutureTask
。
非同步工作是由在背景執行緒上執行的計算所定義,而其結果會在 UI 執行緒上發佈。 非同步工作是由 3 個泛型型別所定義,稱為 Params
、 Progress
和 Result
, 和 4 個步驟,稱為 onPreExecute
、 doInBackground
onProgressUpdate
和 onPostExecute
。
<div class=「special reference」 >< h3 > Developer Guides < /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 > 4 個步驟 < /h2>
執行非同步工作時,工作會經歷 4 個步驟:
<ol >< li >#onPreExecute()
,在執行工作之前,于 UI 執行緒上叫用。 此步驟通常用來設定工作,例如,在使用者介面中顯示進度列。 </li >< li >#doInBackground
,在完成執行之後 #onPreExecute()
立即在背景執行緒上叫用。 此步驟是用來執行可能需要很長時間的背景計算。 非同步工作的參數會傳遞至此步驟。 這個步驟必須傳回計算的結果,而且會傳回最後一個步驟。 此步驟也可用來 #publishProgress
發佈一或多個進度單位。 這些值會在步驟中的 UI 執行緒上 #onProgressUpdate
發佈。 </li >< li >#onProgressUpdate
,在呼叫 之後于 UI 執行緒上叫 #publishProgress
用。 執行的時間未定義。 這個方法可用來在背景計算仍在執行時,在使用者介面中顯示任何形式的進度。 例如,它可以用來以動畫顯示進度列,或在文字欄位中顯示記錄。 </li >< li >#onPostExecute
,在背景計算完成後於 UI 執行緒上叫用。 背景計算的結果會以參數的形式傳遞至此步驟。 </li >< /ol>
<h2 > 取消工作 < /h2>
叫用 #cancel(boolean)
即可隨時取消工作。 叫用此方法會導致後續呼叫 #isCancelled()
傳回 true。 叫用這個方法之後, #onCancelled(Object)
會在傳回之後 #doInBackground(Object[])
叫用 ,而不是 #onPostExecute(Object)
叫用 。 若要確保工作儘快取消,您應該一律定期檢查 的 #doInBackground(Object[])
傳回值 #isCancelled()
,如果可能的話, (實例迴圈內。)
<h2 > 執行緒規則 < /h2>
必須遵循幾個執行緒規則,此類別才能正常運作:
<ul >< li > AsyncTask 類別必須在 UI 執行緒上載入。 這會從 android.os.Build.VERSION_CODES#JELLY_BEAN
自動完成。 </li >< li > 必須在 UI 執行緒上建立工作實例。 <必須在 UI 執行緒上叫用 /li >< li >#execute
。 </li >< li > 請勿手動呼叫 #onPreExecute()
、 #onPostExecute
、 #doInBackground
、 #onProgressUpdate
。 </li li ><> 工作只能執行一次 (嘗試第二次執行時擲回例外狀況。) < /li >< /ul>
<h2 > 記憶體可檢視性 < /h2>
AsyncTask 保證所有回呼呼叫都會同步處理,以確保下列專案沒有明確的同步處理。
<ul >< li > 的記憶體效果 #onPreExecute
,以及呼叫 #execute
之前執行的任何其他專案,包括 AsyncTask 物件的建構,都會 #doInBackground
對 顯示。 <li > 的記憶體效果 #doInBackground
對 #onPostExecute
可見。 <li > 對應呼叫 #publishProgress
之前的任何記憶體效果 #doInBackground
都會顯示在對應的 #onProgressUpdate
呼叫中。 (但要繼續執行,而且 #doInBackground
需要小心,稍後的更新不會干擾進行中的 #doInBackground
#onProgressUpdate
呼叫。) < li > 呼叫之前 #cancel
的任何記憶體效果,都會在呼叫 之後 #isCancelled
顯示,而呼叫 之後會傳回 true,或在產生的呼叫 #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 並行公用程式 。
的 android.os.AsyncTask
JAVA 檔。
此頁面的部分是根據所建立和共用的工作進行修改,並根據 2.5 屬性授權中所述的詞彙來使用。
建構函式
AsyncTask() |
建立新的非同步工作。 |
AsyncTask(IntPtr, JniHandleOwnership) |
建立 JNI 物件的 Managed 標記法時使用的建構函式;由執行時間呼叫。 |
屬性
Class |
傳回這個 |
Handle |
基礎 Android 實例的控制碼。 (繼承來源 Object) |
IsCancelled |
如果此工作在正常完成之前已取消,則傳 |
JniIdentityHashCode |
AsyncTask 旨在啟用適當且容易使用的 UI 執行緒。 (繼承來源 Object) |
JniPeerMembers |
AsyncTask 旨在啟用適當且容易使用的 UI 執行緒。 |
PeerReference |
AsyncTask 旨在啟用適當且容易使用的 UI 執行緒。 (繼承來源 Object) |
SerialExecutor |
, |
ThreadPoolExecutor |
|
ThresholdClass |
此 API 支援適用于 Android 的 Mono 基礎結構,並不適合直接從您的程式碼使用。 |
ThresholdType |
此 API 支援適用于 Android 的 Mono 基礎結構,並不適合直接從您的程式碼使用。 |
方法
Cancel(Boolean) |
嘗試取消此工作的執行。 |
Clone() |
建立並傳回這個 物件的複本。 (繼承來源 Object) |
Dispose() |
AsyncTask 旨在啟用適當且容易使用的 UI 執行緒。 (繼承來源 Object) |
Dispose(Boolean) |
AsyncTask 旨在啟用適當且容易使用的 UI 執行緒。 (繼承來源 Object) |
DoInBackground(Object[]) |
覆寫這個方法,以在背景執行緒上執行計算。 |
Equals(Object) |
指出其他物件是否「等於」這個物件。 (繼承來源 Object) |
Execute(IRunnable) |
方便使用的 版本 |
Execute(Object[]) |
使用指定的參數執行工作。 |
ExecuteOnExecutor(IExecutor, Object[]) |
使用指定的參數執行工作。 |
Get() |
視需要等候計算完成,然後擷取其結果。 |
Get(Int64, TimeUnit) |
視需要等候最多指定時間讓計算完成,然後擷取其結果。 |
GetAsync() |
AsyncTask 旨在啟用適當且容易使用的 UI 執行緒。 |
GetAsync(Int64, TimeUnit) |
AsyncTask 旨在啟用適當且容易使用的 UI 執行緒。 |
GetHashCode() |
傳回此物件的雜湊碼值。 (繼承來源 Object) |
GetStatus() |
傳回此工作的目前狀態。 |
JavaFinalize() |
當垃圾收集判斷物件不再參考物件時,垃圾收集行程會在物件上呼叫。 (繼承來源 Object) |
Notify() |
喚醒正在等候此物件監視器的單一線程。 (繼承來源 Object) |
NotifyAll() |
喚醒正在等候此物件監視器的所有線程。 (繼承來源 Object) |
OnCancelled() |
應用程式最好覆寫 |
OnCancelled(Object) |
叫用 之後 |
OnPostExecute(Object) |
在 之後 |
OnPreExecute() |
在 之前的 |
OnProgressUpdate(Object[]) |
叫用 之後 |
PublishProgress(Object[]) |
當背景計算仍在執行時,可以從 |
SetHandle(IntPtr, JniHandleOwnership) |
設定 Handle 屬性。 (繼承來源 Object) |
ToArray<T>() |
AsyncTask 旨在啟用適當且容易使用的 UI 執行緒。 (繼承來源 Object) |
ToString() |
傳回物件的字串表示。 (繼承來源 Object) |
UnregisterFromRuntime() |
AsyncTask 旨在啟用適當且容易使用的 UI 執行緒。 (繼承來源 Object) |
Wait() |
讓目前的執行緒等到喚醒為止,通常是 em < notified/em > 或 < em > interrupted < /em > 。 >< (繼承來源 Object) |
Wait(Int64) |
讓目前的執行緒等到喚醒為止,通常是 em < notified/em > 或 < em > interrupted < /em > ,或直到經過一定數量的即時為止。 <> (繼承來源 Object) |
Wait(Int64, Int32) |
讓目前的執行緒等到喚醒為止,通常是 em < notified/em > 或 < em > interrupted < /em > ,或直到經過一定數量的即時為止。 <> (繼承來源 Object) |
明確介面實作
IJavaPeerable.Disposed() |
AsyncTask 旨在啟用適當且容易使用的 UI 執行緒。 (繼承來源 Object) |
IJavaPeerable.DisposeUnlessReferenced() |
AsyncTask 旨在啟用適當且容易使用的 UI 執行緒。 (繼承來源 Object) |
IJavaPeerable.Finalized() |
AsyncTask 旨在啟用適當且容易使用的 UI 執行緒。 (繼承來源 Object) |
IJavaPeerable.JniManagedPeerState |
AsyncTask 旨在啟用適當且容易使用的 UI 執行緒。 (繼承來源 Object) |
IJavaPeerable.SetJniIdentityHashCode(Int32) |
AsyncTask 旨在啟用適當且容易使用的 UI 執行緒。 (繼承來源 Object) |
IJavaPeerable.SetJniManagedPeerState(JniManagedPeerStates) |
AsyncTask 旨在啟用適當且容易使用的 UI 執行緒。 (繼承來源 Object) |
IJavaPeerable.SetPeerReference(JniObjectReference) |
AsyncTask 旨在啟用適當且容易使用的 UI 執行緒。 (繼承來源 Object) |
擴充方法
JavaCast<TResult>(IJavaObject) |
執行 Android 執行時間檢查的類型轉換。 |
JavaCast<TResult>(IJavaObject) |
AsyncTask 旨在啟用適當且容易使用的 UI 執行緒。 |
GetJniTypeName(IJavaPeerable) |
AsyncTask 旨在啟用適當且容易使用的 UI 執行緒。 |