公共抽象类
AsyncTask的
扩展对象
的java.lang.Object
↳
android.os.AsyncTask <PARAMS,进展,结果>
类概述
AsyncTask的正确实现,易于使用的用户界面线程。 此类允许执行后台操作而无需操作线程和/或处理程序发布在UI线程上的结果。
AsyncTask的设计是围绕一个辅助类Thread和Handler ,并不构成通用线程框架。 AsyncTasks最好应用于短操作(几秒钟之最。)如果您需要保持运行很长一段时间线程,强烈建议您使用所提供的各种API java.util.concurrent如包Executor , ThreadPoolExecutor和FutureTask 。
一个异步任务由在后台线程运行的计算,其结果发表在UI线程上定义。 一个异步任务由3泛型类型定义,所谓Params , Progress和Result ,以及4个步骤,称为onPreExecute ,doInBackground , onProgressUpdate和onPostExecute 。
用法
AsyncTask的必须被继承使用。 子类将覆盖至少一个方法( doInBackground(Params...)和最经常将覆盖第二个( onPostExecute(Result) 。)
下面是子类的实例:
私有类DownloadFilesTask扩展AsyncTask的<网址,整型,长> { 保护龙doInBackground(URL网址...){ 诠释计数= urls.length; 长totalSize = 0; 对于(INT I = 0;我<计数;我++){ totalSize + = Downloader.downloadFile(网址[I]); publishProgress((INT)((I /(浮点)数)* 100)); //早期逃生,如果取消()被调用 如果(isCancelled())破; } 返回totalSize; } 保护无效onProgressUpdate(整数...进度){ setProgressPercent(进展[0]); } 保护无效onPostExecute(长效){ 的ShowDialog(“已下载”+结果+“字节”); } }
一旦创建,一个任务执行得很干脆:
新DownloadFilesTask()执行(为url1,url2 URL3)。
AsyncTask的的泛型类型
所使用的一个异步任务的三种类型的有以下几种:
Params ,参数的类型发送到在执行任务。Progress ,背景计算期间发布的进展单元的类型。Result ,背景计算的结果的类型。
不是所有类型总是使用一个异步任务。 为了纪念一个类型为未使用,只需使用类型Void :
私有类MyTask的扩展AsyncTask的<太虚,太虚,太虚> {...}
4个步骤
当执行一个异步任务,任务经过4个步骤:
onPreExecute()调用UI线程上执行任务之前。 该步骤通过显示在用户界面的进度条通常用于设置任务,例如。doInBackground(Params...)后,立即在后台线程调用onPreExecute()完成执行。 这个步骤是用于执行背景计算,并可以花费很长时间。 异步任务的参数被传递到这一步。 该计算的结果,必须通过此步骤被返回,将被传递回的最后一步。 这一步也可以使用publishProgress(Progress...)发布的进步一个或多个单元。 这些值公布在UI线程上,在onProgressUpdate(Progress...)一步。onProgressUpdate(Progress...)调用后UI线程上调用publishProgress(Progress...) 的执行的计时是不确定的。 此方法用于显示的任何形式的用户界面中的进展而背景计算仍在执行。 例如,它可用于动画在文本字段进度条或显示日志。onPostExecute(Result) ,后台计算完成后在UI线程调用。 背景计算的结果被传递给此步骤作为一个参数。
取消任务
一个任务可以在任何时候通过调用取消cancel(boolean) 。 调用此方法将导致后续调用isCancelled()返回true。 调用此方法后, onCancelled(Object) ,而不是onPostExecute(Object)后,将被调用doInBackground(Object[])的回报。 为了确保任务尽快取消,您应经常检查返回值isCancelled()定期从doInBackground(Object[])如果可能的话(在例如一个循环。)
线程规则
有迹象表明,必须遵循这一类正常工作的几个线程规则:
该AsyncTask的类必须在UI线程加载。 这是由于自动完成JELLY_BEAN 。任务实例必须在UI线程上创建。execute(Params...)必须在UI线程调用。不要 call onPreExecute() , onPostExecute(Result) , doInBackground(Params...) , onProgressUpdate(Progress...) manually.该任务只能执行一次(如果是第二次执行尝试一个异常将被抛出。)
内存可观测
AsyncTask的保证所有回调调用以这样的方式,下面的操作都没有明确的同步安全同步。
在构造函数或设置成员字段onPreExecute()并指他们在doInBackground(Params...)坐落在成员字段doInBackground(Params...)并参考他们onProgressUpdate(Progress...)和onPostExecute(Result) 。
为了执行
当第一次推出,AsyncTasks是在一个后台线程串行执行。 与开始DONUT ,这改变为线程允许多个任务并行操作的一个池。 开始与HONEYCOMB ,任务在单个线程中执行,以避免因并行执行常见的应用程序错误。
如果你真的想并行执行,你可以调用executeOnExecutor(java.util.concurrent.Executor, Object[])与THREAD_POOL_EXECUTOR 。
总结
嵌套类
枚举
AsyncTask.Status
指示任务的当前状态。
领域
公共静态最后的遗嘱执行人
SERIAL_EXECUTOR
一个Executor ,在串行顺序一次执行任务之一。
公共静态最后的遗嘱执行人
THREAD_POOL_EXECUTOR
一个Executor ,可用于并行执行的任务。
公共构造函数
AsyncTask的 ()
创建一个新的异步任务。
公共方法
最终布尔
取消 (布尔mayInterruptIfRunning)
试图取消对此任务的执行。
静态无效
执行 ( 可运行可运行)
方便版本execute(Object)的一个简单的Runnable对象使用。
最后 AsyncTask的 <PARAMS,进展,结果>
执行 (参数...
PARAMS)
执行指定的参数的任务。
最后 AsyncTask的 <PARAMS,进展,结果>
executeOnExecutor ( 执行人 EXEC,参数...
PARAMS)
执行指定的参数的任务。
最终的结果
得到 (长超时, 为TimeUnit单位)
如有必要,等待至多给定的时间计算完成,然后获取其结果。
最终的结果
得到 ()
如有必要,等待计算完成,然后获取其结果。
最后AsyncTask.Status
的getStatus ()
返回此任务的当前状态。
最终布尔
isCancelled ()
返回true, 如果这个任务被取消之前,正常完成。
受保护的方法
抽象的结果
doInBackground (参数...
PARAMS)
重写此方法在后台线程进行计算。
空间
onCancelled (
结果结果)
在UI线程上运行后cancel(boolean)被调用doInBackground(Object[])已完成。
空间
onCancelled ()
应用程序应该重写最好onCancelled(Object) 。
空间
onPostExecute (结果结果)
运行在UI线程上后, doInBackground(Params...)
空间
onPreExecute ()
之前运行在UI线程doInBackground(Params...)
空间
onProgressUpdate (进展...值)
后在UI线程上运行publishProgress(Progress...)被调用。
最终无效
publishProgress (进展...值)
这种方法可以从调用doInBackground(Params...)到UI线程上发布更新,而后台计算仍在运行。
[展开]
继承的方法
从类的java.lang.Object
领域
公共静态最后的遗嘱执行人 SERIAL_EXECUTOR
加入API级别11
一个Executor ,在串行顺序一次执行任务之一。 这种序列化是全球的一个特定的过程。
公共静态最后的遗嘱执行人 THREAD_POOL_EXECUTOR
加入API级别11
一个Executor ,可用于并行执行的任务。
公共构造函数
公共 AsyncTask的 ()
加入API级别3
创建一个新的异步任务。 此构造方法必须在UI线程调用。
公共方法
公共最后布尔 取消 (布尔mayInterruptIfRunning)
加入API级别3
试图取消对此任务的执行。 如果任务已经完成,已经被取消了这种尝试将会失败,或无法被取消某些其他原因。 如果成功,并取消时调用这个任务还没有开始,这个任务不应该运行。如果任务已经启动, 则 mayInterruptIfRunning参数决定是否执行此任务的线程应该以试图停止任务被中断。
调用此方法将导致onCancelled(Object)被UI线程调用后, doInBackground(Object[])的回报。 调用此方法保证onPostExecute(Object)是永远不会被调用。 调用此方法后,你应该检查返回的值isCancelled()定期从doInBackground(Object[])以尽早完成任务。
参数
mayInterruptIfRunning
真 ,如果执行此任务的线程应该被中断; 否则,在正在进行的任务被允许完成。
回报
否则返回true;如果任务不能被取消,通常是由于它已经正常完成假
公共静态无效 的execute( Runnable的可运行)
加入API级别11
方便版本execute(Object)的一个简单的Runnable对象使用。 见execute(Object[])的执行顺序的更多信息。
公共最后AsyncTask的 <PARAMS,进展,结果> 执行 (参数...
PARAMS)
加入API级别3
执行指定的参数的任务。 任务返回本身(这一点),这样调用者可以保持一个参考吧。
注:此功能的时间表在队列的任务为单个后台线程或取决于平台版本的线程池。 当第一次推出,AsyncTasks是在一个后台线程串行执行。 与开始DONUT ,这改变为线程允许多个任务并行操作的一个池。 开始HONEYCOMB ,任务是回到上一个单独的线程执行,以避免因并行执行常见的应用程序错误。 如果你真的想并行执行,你可以使用executeOnExecutor(Executor, Params...)版本,此方法的THREAD_POOL_EXECUTOR ; 然而,看到的评论有关于它的使用警告。
此方法必须在UI线程调用。
参数
PARAMS
任务的参数。
回报
AsyncTask的实例中。
抛出
IllegalStateException异常
如果getStatus()返回无论是RUNNING或FINISHED 。
公共最后AsyncTask的 <PARAMS,进展,结果> executeOnExecutor( 遗嘱执行人 EXEC,参数...
PARAMS)
加入API级别11
执行指定的参数的任务。 任务返回本身(这一点),这样调用者可以保持一个参考吧。
这种方法通常用于THREAD_POOL_EXECUTOR允许多个任务并行由AsyncTask的管理线程池运行,但你也可以用你自己的Executor自定义的行为。
警告:允许多个任务,以从一个线程池并行运行一般不想要的东西,因为它们的操作的顺序没有限定。 例如,如果这些任务是用于修改任何共同的状态(如写入文件由于一个按钮点击),有修改的顺序没有保证。 如果没有细致的工作有可能在极少数情况下对数据的新版本将超过撰写的一老一,导致晦涩的数据丢失和稳定性问题。 这样的变化最好在连续执行; 为保证此项工作的系列化,无论平台版本,你可以使用此功能SERIAL_EXECUTOR 。
此方法必须在UI线程调用。
参数
EXEC
遗嘱执行人使用。 THREAD_POOL_EXECUTOR可作为松散耦合任务方便进程范围的线程池。
PARAMS
任务的参数。
回报
AsyncTask的实例中。
抛出
IllegalStateException异常
如果getStatus()返回无论是RUNNING或FINISHED 。
公众最终结果GET(长超时, 为TimeUnit单位)
加入API级别3
如有必要,等待至多给定的时间计算完成,然后获取其结果。
参数
暂停
时间取消操作前等待。
单元
的时间单位的超时。
回报
计算的结果。
抛出
CancellationException如果
如果计算被取消。
为ExecutionException
如果计算抛出异常。
InterruptedException的
如果当前线程被中断,而等待。
TimeoutException异常
如果等待超时。
公众最终结果 得到 ()
加入API级别3
如有必要,等待计算完成,然后获取其结果。
回报
计算的结果。
抛出
CancellationException如果
如果计算被取消。
为ExecutionException
如果计算抛出异常。
InterruptedException的
如果当前线程被中断,而等待。
公共最后AsyncTask.Status 的getStatus()
加入API级别3
返回此任务的当前状态。
回报
的当前状态。
公共最后布尔isCancelled()
加入API级别3
返回true, 如果这个任务被取消之前,正常完成。 如果要调用cancel(boolean)的任务,通过此方法返回的值应定期检查,从doInBackground(Object[])以尽快结束任务。
回报
如果真正的任务被取消它完成前
受保护的方法
保护抽象的结果doInBackground(参数... PARAMS)
加入API级别3
重写此方法在后台线程进行计算。 指定的参数传递给参数execute(Params...)这个任务的调用者。 这种方法可以调用publishProgress(Progress...)到UI线程上发布的更新。
参数
PARAMS
任务的参数。
回报
因此,通过该任务的子类定义。
保护无效onCancelled(结果结果)
加入API级别11
在UI线程上运行后cancel(boolean)被调用doInBackground(Object[])已完成。
默认实现调用onCancelled()而忽略结果。 如果你写你自己的实现,不叫super.onCancelled(result) 。
参数
结果
其结果,如果有的话,计算在doInBackground(Object[])可以为空
保护无效onCancelled()
加入API级别3
应用程序应该重写最好onCancelled(Object) 。 这种方法是通过默认实现调用onCancelled(Object) 。
在UI线程上运行后cancel(boolean)被调用doInBackground(Object[])已完成。
保护无效onPostExecute(结果结果)
加入API级别3
运行在UI线程上后, doInBackground(Params...) 指定的结果是返回的值doInBackground(Params...)
如果任务被取消,此方法将不会被调用。
参数
结果
由计算出的运算结果doInBackground(Params...)
保护无效onPreExecute()
加入API级别3
之前运行在UI线程doInBackground(Params...)
也可以看看
onPostExecute(Result)doInBackground(Params...)
保护无效onProgressUpdate(进展...值)
加入API级别3
后在UI线程上运行publishProgress(Progress...)被调用。 指定的值传递给值publishProgress(Progress...)
参数
值
该值指示进度。
最终保护无效publishProgress(进展...值)
加入API级别3
这种方法可以从调用doInBackground(Params...)到UI线程上发布更新,而后台计算仍在运行。 每次调用此方法将触发执行onProgressUpdate(Progress...) UI线程。onProgressUpdate(Progress...)将不会被调用,如果该任务已经被取消。
参数
值
进度值来更新用户界面。