AsyncTask官方文档教程整理
简介
android给我们提供了一种轻量级的异步任务类asynctask。该类中实现异步操作,并提供接口反馈当前异步执行结果及进度,这些接口中有直接运行在主线程中的(如 onpostexecute,onpreexecute等)。
asynctask可以轻松正确的使用ui线程,这个类允许你在后台操作,并且不需要使用threads或者handler将结果发布到ui线程。
asynctask设计之初就是辅助thread和handler的,并且不会生成线程。asynctask应该被用于短时间内的操作(最多几秒钟),如果你想要长时间保持线程运行,请使用executor或者threadpoolexecutor或者futuretask。
asynctask在后台运行任务,在ui线程发布结果,定义三个参数,params, progress和result,执行四个步骤,onpreexecute, doinbackground, onprogressupdate和onpostexecute。
使用方法
asynctask必须被继承来使用。子类必须实现至少一个方法(ddoinbackground(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);
asynctasks的范型参数
异步任务使用的参数是:
- params, 启动任务时传入的参数
- progress, 在后台任务执行时发布到ui线程的进度类型
- result, 后台任务执行完成的结果
这三个参数不一定非要指定,可以使用void来传入空值。
private class mytask extends asynctask<void, void, void> { ... }
4个步骤
-
onpreexecute()
,在应用程序执行前在ui线程上调用。这步通常被用来准备任务开始,例如显示一个进度条。 -
doinbackground(params…)
,在onpreexecute()
方法被调用后立即执行此方法,用来执行长时间的任务。 - 参数会在这一步传入,最后的结果必须返回。在这步页可以使用
publishprogress(progress...)
来发布进度,这些值时在ui线程中发布的,在onprogressupdate(progress...)
接收。onprogressupdate(progress…)
, 在publishprogress(progress...)
方法调用后在ui线程调用此方法。执行时间未定义。该方法用于在后台计算仍在执行时,用户界面中显示的进度。例如,它可以用于对进度条进行动画处理或在文本字段中显示日志。 -
onpostexecute(result)
,在后台计算完成后在ui线程上调用。 后台计算的结果作为参数传递给该步骤。
取消异步任务
任何时候都可以通过调用cancel(boolean)
方法来取消任务。
调用此方法将导致对iscancelled()
的后续调用返回true。
调用此方法后,oncancelled(object)
,而不调用onpostexecute(object)
为了尽可能快地取消任务,应该始终从doinbackground(object [])
中定期检查iscancelled()
的返回值(如果可能的话)。
线程规则
- 必须在ui线程上加载asynctask类。
- 必须在ui线程上创建任务实例。
- 必须在ui线程上调用
execute(params …)
- 不要手动调用
onpreexecute()
,onpostexecute(result)
,doinbackground(params …)
,onprogressupdate(progress …)
。 - 该任务只能执行一次(如果尝试第二次执行,将抛出异常)。
内存监控
asynctask保证所有回调调用都是同步的,使得以下操作在没有显式同步的情况下是安全的。
- 在构造函数或
onpreexecute()
中设置成员字段,并在doinbackground(params …)
中引用它们。 - 在
doinbackground(params …)
中设置成员字段,并在onprogressupdate(progress …)
和onpostexecute(result)
中引用它们。
执行顺序
首次引入时,asynctasks在单个后台线程上串行执行。
从donut开始,这被更改为一个允许多个任务并行操作的线程池。
从honeycomb开始,任务在单个线程上执行,以避免并行执行引起的常见应用程序错误。
如果真的需要并行执行,则可以使用thread_pool_executor调用executeonexecutor(java.util.concurrent.executor,object [])
。
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对的支持。
推荐阅读
-
AsyncTask官方文档教程整理
-
前两天麻烦两位斑竹了!现在Linux服务器的升级工作已经全部完成,这里把整理过的升级后的文档共享给大_PHP教程
-
AsyncTask官方文档教程整理
-
前两天麻烦两位斑竹了现在Linux服务器的升级工作已经全部完成,这里把整理过的升级后的文档共享给大家_PHP教程
-
韩顺平_php从入门到精通_视频教程_第19讲_网站推荐_定位_学习札记_源代码图解_PPT文档整理
-
React 实现井字棋游戏 (tic-tac-toe) 教程 (2) <译自官方文档>
-
韩顺平_php从入门到精通_视频教程_第19讲_网站推荐_定位_学习札记_源代码图解_PPT文档整理
-
韩顺平_php从入门到精通_视频教程_第19讲_网站推荐_定位_学习札记_源代码图解_PPT文档整理
-
韩顺平_php从入门到精通_视频教程_第21讲_解答学员有关问题_学习笔记_源代码图解_PPT文档整理
-
MXNet官方文档中文版教程(9):大规模图像分类