
AsyncTask源码分析
线程池执行:默认使用一个线程池,每个 执行前准备:在主线程调用 数据处理:在子线程执行 进度更新:通过 结果处理:在子线程完成后,通过 执行开始:调用 执行准备:依次调用 数据处理:在子线程执行 结果更新:当数据处理完成,通过线程池调用 UI更新:在主线程中调用
发布日期:2021-05-14 09:35:21
浏览次数:26
分类:精选文章
本文共 1849 字,大约阅读时间需要 6 分钟。
AsyncTask,Android 中实现异步方式之一,允许在子线程执行数据操作,然后在主线程更新 UI。Handler 也可用于异步处理,详细内容可参考文档。
AsyncTask 的简单使用示例
创建一个继承自 AsyncTask
的类,指定三个泛型参数:Params
、Progress
和 Result
。在构造函数中,传入初始化参数或执行准备操作。
public class MyAsyncTask extends AsyncTask{ @Override protected Result doInBackground(Params... params) { // 执行耗时操作,例如网络请求或数据库查询 } @Override protected void onPostExecute(Result result) { // 更新 UI,处理结果 }}
调用方式如下:
MyAsyncTask task = new MyAsyncTask();task.execute(params);
任务流程
AsyncTask
对象只能执行一次。onPreExecute
。doInBackground
,可传递参数和更新进度。publishProgress
在主线程更新 UI。postResult
将结果发送至主线程触发 onPostExecute
。实现细节
- 执行状态:确保每个
AsyncTask
只能一次执行,避免资源冲突。 - 默认线程池:所有操作共享一个线程池,以提高效率且防止多次执行。
- 安全机制:防止已取消的任务重复执行,确保UI响应性。
InternalHandler 解析
AsyncTask 内部使用 InternalHandler
处理消息,确保UI操作在主线程执行。getMainHandler
方法得到主线程的 Handler
实例。
private static Handler getMainHandler() { synchronized (AsyncTask.class) { if (sHandler == null) { sHandler = new InternalHandler(Looper.getMainLooper()); } return sHandler; }}private static class InternalHandler extends Handler { @Override public void handleMessage(Message msg) { switch (msg.what) { case MESSAGE_POST_RESULT: result.mTask.finish(result.mData); break; case MESSAGE_POST_PROGRESS: result.mTask.onProgressUpdate(result.mData); break; } }}
执行流程
execute(Params... params)
。onPreExecute
。doInBackground
,中间可调用 publishProgress
。postResult
,将结果发送至主线程。onPostExecute
或 onCancelled
。优点
- 简化UI更新:确保UI操作在主线程执行,避免 GUI �ีป滞。
- 提高效率:仅执行一次任务,减少资源占用。
- 灵活性:支持多种进度更新和结果处理方式。
通过理解这些关键点,可以有效地利用 AsyncTask 进行异步操作,确保应用程序的性能和用户体验。
发表评论
最新留言
路过,博主的博客真漂亮。。
[***.116.15.85]2025年04月27日 10时09分46秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
ubuntu16.04下系统配置
2019-03-12
电容的分类与用途
2019-03-12
Max9286与max96705通信过程分析
2019-03-12
国内有哪些比较靠谱的云服务器?
2019-03-12
OPPOReno6Pro+和OPPOReno6Pro的区别 哪个好
2019-03-12
小扎扎学测试笔记打卡-数据库测试mysql
2019-03-12
软件测试常用的测试工具分享
2019-03-12
关于bootstrap4.0无法引用图标的问题
2019-03-12
我的第一篇博客 2021-05-10
2019-03-12
Java语言有哪些注释的方式?
2019-03-12
Java中有几种基本数据类型?它们分别占多大字节?
2019-03-12
Java中基本类型的转换规则
2019-03-12
如何将字符串写入文件?
2019-03-12
Servlet中的doPost和doGet方法有什么区别?传递和获取参数上有什么区别?
2019-03-12
统计一段长字符串中某字符串的出现次数
2019-03-12
linux指令-wc
2019-03-12
Oracle中function和procedure有什么区别?
2019-03-12
Redis 集群会有写操作丢失吗?
2019-03-12
Js插入元素到数组的头部 unshift
2019-03-12