public abstract class AsyncTask
extends Object
java.lang.Object | |
↳ | android.os.AsyncTask<Params, Progress, Result> |
AsyncTask支持正确和简单地使用UI线程。 该类允许执行后台操作并在UI线程上发布结果,而无需操纵线程和/或处理程序。
AsyncTask被设计成一个围绕Thread
和Handler
的帮助类,并不构成通用的线程框架。 AsyncTasks应该理想地(最多几秒钟。)可用于短期操作。如果您需要保持对长时间运行的线程,强烈建议您使用所提供的各种API java.util.concurrent
包装如Executor
, ThreadPoolExecutor
和FutureTask
。
异步任务由在后台线程上运行的计算定义,并且其结果在UI线程上发布。 异步任务是由3种一般类型定义,称为Params
, Progress
和Result
,和4个步骤,称为onPreExecute
, doInBackground
, onProgressUpdate
和onPostExecute
。
有关使用任务和线程的更多信息,请阅读 Processes and Threads开发人员指南。
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);
异步任务使用的三种类型如下:
Params
, the type of the parameters sent to the task upon execution.Progress
, the type of the progress units published during the background computation.Result
, the type of the result of the background computation.并非所有类型总是由异步任务使用。 要将某个类型标记为未使用,只需使用类型Void
:
private class MyTask extends AsyncTask<Void, Void, Void> { ... }
当执行一个异步任务时,任务需要经过4个步骤:
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.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.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.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.通过调用cancel(boolean)
可以随时取消任务。 调用此方法将导致对isCancelled()
后续调用返回true。 调用此方法后, onCancelled(Object)
,而不是onPostExecute(Object)
后会被调用doInBackground(Object[])
回报。 为了确保任务是尽快取消,您应经常检查返回值isCancelled()
定期从doInBackground(Object[])
,如果可能的话(例如一个循环中。)
有一些线程规则必须遵循才能正确工作:
JELLY_BEAN
.execute(Params...)
must be invoked on the UI thread.onPreExecute()
, onPostExecute(Result)
, doInBackground(Params...)
, onProgressUpdate(Progress...)
manually.AsyncTask保证所有的回调调用都是以这样一种方式进行同步的,即在没有明确同步的情况下以下操作是安全的。
onPreExecute()
, and refer to them in doInBackground(Params...)
. doInBackground(Params...)
, and refer to them in onProgressUpdate(Progress...)
and onPostExecute(Result)
. 首次引入时,AsyncTasks在单个后台线程上被串行执行。 从DONUT
开始,这被更改为允许多个任务并行操作的线程池。 从HONEYCOMB
开始,任务在单个线程上执行,以避免由并行执行导致的常见应用程序错误。
如果你真的想并行执行,你可以调用 executeOnExecutor(java.util.concurrent.Executor, Object[])
与 THREAD_POOL_EXECUTOR
。
Nested classes |
|
---|---|
枚举 |
AsyncTask.Status 指示任务的当前状态。 |
Fields |
|
---|---|
public static final Executor |
SERIAL_EXECUTOR 一个 |
public static final Executor |
THREAD_POOL_EXECUTOR 一个 |
Public constructors |
|
---|---|
AsyncTask() 创建一个新的异步任务。 |
Public methods |
|
---|---|
final boolean |
cancel(boolean mayInterruptIfRunning) 试图取消执行此任务。 |
final AsyncTask<Params, Progress, Result> |
execute(Params... params) 用指定的参数执行任务。 |
static void |
execute(Runnable runnable)
|
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() 应用程序应优先覆盖 |
void |
onCancelled(Result result) 在 |
void |
onPostExecute(Result result) 在 |
void |
onPreExecute() 在 |
void |
onProgressUpdate(Progress... values) 在调用 |
final void |
publishProgress(Progress... values) 可以从 |
Inherited methods |
|
---|---|
From class java.lang.Object
|
Executor SERIAL_EXECUTOR
Executor
,按顺序执行一个任务。 这个序列化对于一个特定的过程是全球性的。
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 |
也可以看看:
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 . |
void execute (Runnable runnable)
execute(Object)
于简单Runnable对象的便捷版execute(Object)
。 有关执行顺序的更多信息,请参阅execute(Object[])
。
Parameters | |
---|---|
runnable |
Runnable
|
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 . |
也可以看看:
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. |
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. |
AsyncTask.Status getStatus ()
返回此任务的当前状态。
Returns | |
---|---|
AsyncTask.Status |
The current status. |
boolean isCancelled ()
如果此任务在正常完成之前取消,则返回true 。 如果您正在对任务调用cancel(boolean)
,应该定期从doInBackground(Object[])
检查此方法返回的值,以尽快结束任务。
Returns | |
---|---|
boolean |
true if task was cancelled before it completed |
也可以看看:
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. |
void onCancelled ()
应用程序应优先覆盖onCancelled(Object)
。 此方法由默认实现onCancelled(Object)
调用。
在 cancel(boolean)
被调用并且 doInBackground(Object[])
完成后在UI线程上运行。
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 |
也可以看看:
void onPostExecute (Result result)
在doInBackground(Params...)
之后在UI线程上运行。 指定的结果是由doInBackground(Params...)
返回的值。
如果任务被取消,则不会调用此方法。
Parameters | |
---|---|
result |
Result : The result of the operation computed by doInBackground(Params...) . |
void onProgressUpdate (Progress... values)
在调用publishProgress(Progress...)
之后在UI线程上运行。 指定的值是传递给publishProgress(Progress...)
的值。
Parameters | |
---|---|
values |
Progress : The values indicating progress. |
void publishProgress (Progress... values)
可以从doInBackground(Params...)
调用此方法,以便在后台计算仍在运行时在UI线程上发布更新。 每次调用此方法都将触发UI线程上的onProgressUpdate(Progress...)
的执行。 如果任务已被取消,则不会调用onProgressUpdate(Progress...)
。
Parameters | |
---|---|
values |
Progress : The progress values to update the UI with. |