Most visited

Recently visited

Added in API level 3

AsyncTask

public abstract class AsyncTask
extends Object

java.lang.Object
   ↳ android.os.AsyncTask<Params, Progress, Result>


AsyncTask支持正确和简单地使用UI线程。 该类允许执行后台操作并在UI线程上发布结果,而无需操纵线程和/或处理程序。

AsyncTask被设计成一个围绕ThreadHandler的帮助类,并不构成通用的线程框架。 AsyncTasks应该理想地(最多几秒钟。)可用于短期操作。如果您需要保持对长时间运行的线程,强烈建议您使用所提供的各种API java.util.concurrent包装如ExecutorThreadPoolExecutorFutureTask

异步任务由在后台线程上运行的计算定义,并且其结果在UI线程上发布。 异步任务是由3种一般类型定义,称为ParamsProgressResult ,和4个步骤,称为onPreExecutedoInBackgroundonProgressUpdateonPostExecute

Developer Guides

有关使用任务和线程的更多信息,请阅读 Processes and Threads开发人员指南。

Usage

AsyncTask必须被子类化才能使用。 子类将覆盖的至少一种方法( doInBackground(Params...) ),最经常将覆盖的第二个( onPostExecute(Result) )。

这是一个子类化的例子:

 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);
 

AsyncTask's generic types

异步任务使用的三种类型如下:

  1. Params, the type of the parameters sent to the task upon execution.
  2. Progress, the type of the progress units published during the background computation.
  3. Result, the type of the result of the background computation.

并非所有类型总是由异步任务使用。 要将某个类型标记为未使用,只需使用类型Void

 private class MyTask extends AsyncTask<Void, Void, Void> { ... }
 

The 4 steps

当执行一个异步任务时,任务需要经过4个步骤:

  1. onPreExecute(), invoked on the UI thread before the task is executed. This step is normally used to setup the task, for instance by showing a progress bar in the user interface.
  2. doInBackground(Params...), invoked on the background thread immediately after onPreExecute() finishes executing. This step is used to perform background computation that can take a long time. The parameters of the asynchronous task are passed to this step. The result of the computation must be returned by this step and will be passed back to the last step. This step can also use publishProgress(Progress...) to publish one or more units of progress. These values are published on the UI thread, in the onProgressUpdate(Progress...) step.
  3. onProgressUpdate(Progress...), invoked on the UI thread after a call to publishProgress(Progress...). The timing of the execution is undefined. This method is used to display any form of progress in the user interface while the background computation is still executing. For instance, it can be used to animate a progress bar or show logs in a text field.
  4. onPostExecute(Result), invoked on the UI thread after the background computation finishes. The result of the background computation is passed to this step as a parameter.

Cancelling a task

通过调用cancel(boolean)可以随时取消任务。 调用此方法将导致对isCancelled()后续调用返回true。 调用此方法后, onCancelled(Object) ,而不是onPostExecute(Object)后会被调用doInBackground(Object[])回报。 为了确保任务是尽快取消,您应经常检查返回值isCancelled()定期从doInBackground(Object[]) ,如果可能的话(例如一个循环中。)

Threading rules

有一些线程规则必须遵循才能正确工作:

Memory observability

AsyncTask保证所有的回调调用都是以这样一种方式进行同步的,即在没有明确同步的情况下以下操作是安全的。

Order of execution

首次引入时,AsyncTasks在单个后台线程上被串行执行。 DONUT开始,这被更改为允许多个任务并行操作的线程池。 HONEYCOMB开始,任务在单个线程上执行,以避免由并行执行导致的常见应用程序错误。

如果你真的想并行执行,你可以调用 executeOnExecutor(java.util.concurrent.Executor, Object[])THREAD_POOL_EXECUTOR

Summary

Nested classes

枚举 AsyncTask.Status

指示任务的当前状态。

Fields

public static final Executor SERIAL_EXECUTOR

一个 Executor ,按顺序执行一个任务。

public static final Executor THREAD_POOL_EXECUTOR

一个 Executor可以用来并行执行任务。

Public constructors

AsyncTask()

创建一个新的异步任务。

Public methods

final boolean cancel(boolean mayInterruptIfRunning)

试图取消执行此任务。

final AsyncTask<Params, Progress, Result> execute(Params... params)

用指定的参数执行任务。

static void execute(Runnable runnable)

execute(Object)于简单Runnable对象的便捷版 execute(Object)

final AsyncTask<Params, Progress, Result> executeOnExecutor(Executor exec, Params... params)

用指定的参数执行任务。

final Result get(long timeout, TimeUnit unit)

如果需要,最多等待计算完成的给定时间,然后检索其结果。

final Result get()

如果需要,等待计算完成,然后检索其结果。

final AsyncTask.Status getStatus()

返回此任务的当前状态。

final boolean isCancelled()

如果此任务在正常完成之前取消,则返回 true

Protected methods

abstract Result doInBackground(Params... params)

重写此方法以在后台线程上执行计算。

void onCancelled()

应用程序应优先覆盖 onCancelled(Object)

void onCancelled(Result result)

cancel(boolean)被调用并且 doInBackground(Object[])完成之后在UI线程上运行。

void onPostExecute(Result result)

doInBackground(Params...)之后在UI线程上运行。

void onPreExecute()

doInBackground(Params...)之前在UI线程上运行。

void onProgressUpdate(Progress... values)

在调用 publishProgress(Progress...)后在UI线程上运行。

final void publishProgress(Progress... values)

可以从 doInBackground(Params...)调用此方法在后台计算仍在运行时在UI线程上发布更新。

Inherited methods

From class java.lang.Object

Fields

SERIAL_EXECUTOR

Added in API level 11
Executor SERIAL_EXECUTOR

Executor ,按顺序执行一个任务。 这个序列化对于一个特定的过程是全球性的。

THREAD_POOL_EXECUTOR

Added in API level 11
Executor THREAD_POOL_EXECUTOR

Executor可用于并行执行任务。

Public constructors

AsyncTask

Added in API level 3
AsyncTask ()

创建一个新的异步任务。 这个构造函数必须在UI线程上调用。

Public methods

cancel

Added in API level 3
boolean cancel (boolean mayInterruptIfRunning)

试图取消执行此任务。 如果任务已完成,已被取消或因其他原因无法取消,此尝试将失败。 如果成功,并且调用cancel时此任务尚未开始,则此任务不应运行。 如果任务已经启动,那么mayInterruptIfRunning参数确定执行此任务的线程是否应该中断以试图停止任务。

调用此方法将导致onCancelled(Object)doInBackground(Object[])返回后在UI线程上调用doInBackground(Object[]) 调用此方法可保证onPostExecute(Object)从不被调用。 调用此方法后,应该定期从doInBackground(Object[])检查由isCancelled()返回的值,以isCancelled()完成任务。

Parameters
mayInterruptIfRunning boolean: true if the thread executing this task should be interrupted; otherwise, in-progress tasks are allowed to complete.
Returns
boolean false if the task could not be cancelled, typically because it has already completed normally; true otherwise

也可以看看:

execute

Added in API level 3
AsyncTask<Params, Progress, Result> execute (Params... params)

用指定的参数执行任务。 任务返回自己(this),以便调用者可以保留对它的引用。

注意:此函数根据平台版本为单个后台线程或线程池调度队列上的任务。 首次引入时,AsyncTasks在单个后台线程上被串行执行。 DONUT开始,将其更改为允许多个任务并行操作的线程池。 HONEYCOMB开始,任务将重新在单个线程上执行,以避免由并行执行导致的常见应用程序错误。 如果你真的想并行执行,则可以使用executeOnExecutor(Executor, Params...)版本此方法的THREAD_POOL_EXECUTOR ; 不过,请参阅那里的评论,以了解它的使用警告。

该方法必须在UI线程上调用。

Parameters
params Params: The parameters of the task.
Returns
AsyncTask<Params, Progress, Result> This instance of AsyncTask.
Throws
IllegalStateException If getStatus() returns either RUNNING or FINISHED.

也可以看看:

execute

Added in API level 11
void execute (Runnable runnable)

execute(Object)于简单Runnable对象的便捷版execute(Object) 有关执行顺序的更多信息,请参阅execute(Object[])

Parameters
runnable Runnable

也可以看看:

executeOnExecutor

Added in API level 11
AsyncTask<Params, Progress, Result> executeOnExecutor (Executor exec, 
                Params... params)

用指定的参数执行任务。 任务返回自己(this),以便调用者可以保留对它的引用。

此方法通常与 THREAD_POOL_EXECUTOR一起使用,以允许多个任务在由AsyncTask管理的线程池上并行运行,但您也可以使用自己的 Executor作为自定义行为。

警告:允许多个任务从线程池并行运行通常不是您想要的,因为它们的操作顺序未定义。 例如,如果这些任务用于修改任何共同的状态(例如由于按钮点击而编写文件),则不能保证修改的顺序。 如果没有仔细的工作,在极少数情况下,较旧版本的数据可能会被较旧版本覆盖,从而导致数据丢失和稳定性问题。 这种变化最好是连续执行; 为了保证这些工作被序列化,无论平台版本如何,您都可以使用SERIAL_EXECUTOR此功能。

该方法必须在UI线程上调用。

Parameters
exec Executor: The executor to use. THREAD_POOL_EXECUTOR is available as a convenient process-wide thread pool for tasks that are loosely coupled.
params Params: The parameters of the task.
Returns
AsyncTask<Params, Progress, Result> This instance of AsyncTask.
Throws
IllegalStateException If getStatus() returns either RUNNING or FINISHED.

也可以看看:

get

Added in API level 3
Result get (long timeout, 
                TimeUnit unit)

如果需要,最多等待计算完成的给定时间,然后检索其结果。

Parameters
timeout long: Time to wait before cancelling the operation.
unit TimeUnit: The time unit for the timeout.
Returns
Result The computed result.
Throws
CancellationException If the computation was cancelled.
ExecutionException If the computation threw an exception.
InterruptedException If the current thread was interrupted while waiting.
TimeoutException If the wait timed out.

get

Added in API level 3
Result get ()

如果需要,等待计算完成,然后检索其结果。

Returns
Result The computed result.
Throws
CancellationException If the computation was cancelled.
ExecutionException If the computation threw an exception.
InterruptedException If the current thread was interrupted while waiting.

getStatus

Added in API level 3
AsyncTask.Status getStatus ()

返回此任务的当前状态。

Returns
AsyncTask.Status The current status.

isCancelled

Added in API level 3
boolean isCancelled ()

如果此任务在正常完成之前取消,则返回true 如果您正在对任务调用cancel(boolean) ,应该定期从doInBackground(Object[])检查此方法返回的值,以尽快结束任务。

Returns
boolean true if task was cancelled before it completed

也可以看看:

Protected methods

doInBackground

Added in API level 3
Result doInBackground (Params... params)

重写此方法以在后台线程上执行计算。 指定的参数是由此任务的调用者传递给execute(Params...)的参数。 此方法可以调用publishProgress(Progress...)在UI线程上发布更新。

Parameters
params Params: The parameters of the task.
Returns
Result A result, defined by the subclass of this task.

也可以看看:

onCancelled

Added in API level 3
void onCancelled ()

应用程序应优先覆盖onCancelled(Object) 此方法由默认实现onCancelled(Object)调用。

cancel(boolean)被调用并且 doInBackground(Object[])完成后在UI线程上运行。

也可以看看:

onCancelled

Added in API level 11
void onCancelled (Result result)

cancel(boolean)被调用并且 doInBackground(Object[])完成之后在UI线程上运行。

默认实现只调用onCancelled()并忽略结果。 如果您编写自己的实现,请不要致电super.onCancelled(result)

Parameters
result Result: The result, if any, computed in doInBackground(Object[]), can be null

也可以看看:

onPostExecute

Added in API level 3
void onPostExecute (Result result)

doInBackground(Params...)之后在UI线程上运行。 指定的结果是由doInBackground(Params...)返回的值。

如果任务被取消,则不会调用此方法。

Parameters
result Result: The result of the operation computed by doInBackground(Params...).

也可以看看:

onPreExecute

Added in API level 3
void onPreExecute ()

doInBackground(Params...)之前在UI线程上运行。

也可以看看:

onProgressUpdate

Added in API level 3
void onProgressUpdate (Progress... values)

在调用publishProgress(Progress...)之后在UI线程上运行。 指定的值是传递给publishProgress(Progress...)的值。

Parameters
values Progress: The values indicating progress.

也可以看看:

publishProgress

Added in API level 3
void publishProgress (Progress... values)

可以从doInBackground(Params...)调用此方法,以便在后台计算仍在运行时在UI线程上发布更新。 每次调用此方法都将触发UI线程上的onProgressUpdate(Progress...)的执行。 如果任务已被取消,则不会调用onProgressUpdate(Progress...)

Parameters
values Progress: The progress values to update the UI with.

也可以看看:

Hooray!