Share via


AsyncTask 類別

定義

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
衍生
屬性

備註

AsyncTask 旨在啟用適當且容易使用的 UI 執行緒。 不過,最常見的使用案例是整合至 UI,這會導致內容外泄、遺漏回呼,或在組態變更時當機。 它在不同版本的平臺上也有不一致的行為,會抑制 的 doInBackground 例外狀況,而且不會直接使用 Executor 提供太多公用程式。

AsyncTask 的設計目的是要作為協助程式類別, Thread 而且 Handler 不會構成泛型執行緒架構。 AsyncTasks 最好用於簡短作業, (最多幾秒鐘。) 如果您需要讓執行緒長時間執行,強烈建議您使用封裝所提供的 java.util.concurrent 各種 API,例如 ExecutorThreadPoolExecutorFutureTask

非同步工作是由在背景執行緒上執行的計算所定義,而其結果會在 UI 執行緒上發佈。 非同步工作是由 3 個泛型型別所定義,稱為 ParamsProgressResult , 和 4 個步驟,稱為 onPreExecutedoInBackgroundonProgressUpdateonPostExecute

<div class=「special reference」 >< h3 > Developer Guides < /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 > 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

傳回這個 Object 的執行時間類別。

(繼承來源 Object)
Handle

基礎 Android 實例的控制碼。

(繼承來源 Object)
IsCancelled

如果此工作在正常完成之前已取消,則傳 true 回 。

JniIdentityHashCode

AsyncTask 旨在啟用適當且容易使用的 UI 執行緒。

(繼承來源 Object)
JniPeerMembers

AsyncTask 旨在啟用適當且容易使用的 UI 執行緒。

PeerReference

AsyncTask 旨在啟用適當且容易使用的 UI 執行緒。

(繼承來源 Object)
SerialExecutor

Executor 以序列順序一次執行一個工作。

ThreadPoolExecutor

Executor,可用來平行執行工作。

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...) ,可與簡單的 Runnable 物件搭配使用。

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)

OnCancelled(Object)

叫用 之後 #cancel(boolean) 在 UI 執行緒上執行,且 #doInBackground(Object[]) 已完成。

OnPostExecute(Object)

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

OnPreExecute()

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

OnProgressUpdate(Object[])

叫用 之後 #publishProgress ,在 UI 執行緒上執行。

PublishProgress(Object[])

當背景計算仍在執行時,可以從 #doInBackground 叫用這個方法,在 UI 執行緒上發佈更新。

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 執行緒。

適用於