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
、 onProgressUpdate
doInBackground
和 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
发布一个或多个进度单元。 这些值在步骤中的 #onProgressUpdate
UI 线程上发布。</li><li>#onProgressUpdate
,在调用 #publishProgress
后在 UI 线程上调用。 执行的时间未定义。 此方法用于在后台计算仍在执行时在用户界面中显示任何形式的进度。 例如,它可用于对进度栏进行动画处理或在文本字段中显示日志。</li><li>#onPostExecute
,后台计算完成后在 UI 线程上调用。 后台计算的结果作为参数传递给此步骤。</li></ol>
<h2>取消任务</h2>
可以通过调用 #cancel(boolean)
随时取消任务。 调用此方法将导致对 的后续调用 #isCancelled()
返回 true。 调用此方法后,#onCancelled(Object)
将在 返回后#doInBackground(Object[])
调用 而不是 #onPostExecute(Object)
。 若要确保尽快取消任务,应始终从 #doInBackground(Object[])
定期检查 的返回值#isCancelled()
,如果可能, (instance.)
<h2>线程规则</h2>
必须遵循一些线程规则才能使此类正常工作:
<ul><li>必须在 UI 线程上加载 AsyncTask 类。 从 起 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
之前的任何内存影响在调用结果返回 true 后 #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 并发实用工具 。
的 android.os.AsyncTask
Java 文档。
此页面的某些部分是基于 创建和共享的工作进行的修改,并根据 署名许可中所述的条款使用。
构造函数
AsyncTask() |
创建新的异步任务。 |
AsyncTask(IntPtr, JniHandleOwnership) |
创建 JNI 对象的托管表示形式时使用的构造函数;由运行时调用。 |
属性
Class |
返回此 |
Handle |
基础 Android 实例的句柄。 (继承自 Object) |
IsCancelled |
|
JniIdentityHashCode |
AsyncTask 旨在实现 UI 线程的正确和轻松使用。 (继承自 Object) |
JniPeerMembers |
AsyncTask 旨在实现 UI 线程的正确和轻松使用。 |
PeerReference |
AsyncTask 旨在实现 UI 线程的正确和轻松使用。 (继承自 Object) |
SerialExecutor |
一个 |
ThreadPoolExecutor |
|
ThresholdClass |
此 API 支持 Mono for Android 基础结构,不应直接从代码中使用。 |
ThresholdType |
此 API 支持 Mono for Android 基础结构,不应直接从代码中使用。 |
方法
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 <通知/em> 或 <em>interrupted</em>。<> (继承自 Object) |
Wait(Int64) |
导致当前线程等待,直到它被唤醒,通常是通过 em <通知/em> 或 <em>interrupted</em>,或直到经过一定数量的实时。<> (继承自 Object) |
Wait(Int64, Int32) |
导致当前线程等待,直到它被唤醒,通常是通过 em <通知/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 线程的正确和轻松使用。 |