Android AsyncTask的源码探秘
AsyncTask,顾名思义,表示异步任务。
它是一个处理异步任务的类,通过它,可以实现UI线程和后台线程进行通讯,后台线程执行异步任务,并把结果返回给UI线程。
透过最真实的源码,我们来看看它有哪些优点和缺点。( 括号 代表图片中的箭头注释)
一、首选我们来再看看它的构造方法:
(1)处 mWorker很简单,就是实现了Callable的匿名类,保存了外部传入的参数Params,它其实是最终执行的任务。
最后传给(2)处 mFutrue做参数。
而mFutrue就是中间一层代码,它负责外面的异常处理。
mWorker 的call方法中,调用了我们熟悉的AsyncTask的必需实现方法 doInBackground,而且最后它调用了postResult方法。postResult 就是返回进度与结果方法,没错,就是onProgressUpdate与onPostExecute,这样一看,是不是觉得很简单。
二、postResult的具体实现
从上面可以看出,(1)(2)处的onProgressUpdate与onPostExecute的方法,其实还是借助 Handler 来完成,这个Handler是一个内部类,而且是单例模式,并且它是在UI主线程中,(3)处表示是该Handler 是在主线程中创建,所以也保证了onProgressUpdate与onPostExecute方法 也是在 UI线程中执行。
三、执行方式
AsyncTask有2种执行方式:串行与并行。默认的执行方式是串行,当然现在它也能并行执行,看下 execute 方法,如下图:
这个SerialExecutor 也是一个内部类,它里面包含一个ArrayDeque(任务队列),它每次都会从队首取出一个任务,执行完才会执行下一个任务,只到队列为空为止。它实际的执行类其实是一个ThreadPoolExecutor。
所以如果想要以并行方式执行,就可以用 executeOnExecutor 方法,我们自己new一个ThreadPoolExecutor当参数,可以先定同时运行多少个任务等属性。
四、总结:
看完这些主要的源码,我们知道了它内部运行的原理,所以用它的时候就要注意以下几点了:
1、我们定义AsyncTask的时候,要么定义为 静态匿名内部类,要么在Activity销毁的时候及时关闭AsyncTask。
由于内部类的特点,AsyncTask内部类会持有外部类的隐式引用。由于AsyncTask的生命周期可能比Activity的长,当Activity进行销毁AsyncTask还在执行时,由于AsyncTask持有Activity的引用,导致Activity对象无法回收,进而产生内存泄露。
2、AsyncTask的cancel方法,有时候不一定起作用,因为在doInBackground中,并没有对 cancel 标志作判断,需要用户自己加上,并严格控制。
Android AsyncTask的源码探秘相关推荐
- Android Gradle Plugin 源码解析(上)
一.源码依赖 本文基于: android gradle plugin版本: com.android.tools.build:gradle:2.3.0 gradle 版本:4.1 Gradle源码总共3 ...
- 【转】Android 4.3源码的下载和编译环境的安装及编译
原文网址:http://jingyan.baidu.com/article/c85b7a641200e0003bac95a3.html 告诉windows用户一个不好的消息,windows环境下没法 ...
- 可视化工具gephi源码探秘(二)---导入netbeans
在上篇<可视化工具gephi源码探秘(一)>中主要介绍了如何将gephi的源码导入myeclipse中遇到的一些问题,此篇接着上篇而来,主要讲解当下通过myeclipse导入gephi源码 ...
- android编译.a文件,Android 7.1源码编译导入AS完整教程
本教程仅针对Android 7.1系统,为便于虚拟机备份和出现问题时的还原,本教程分为3步:初始化编译环境.源码同步.编译源码导入Android Studio. 编译源码:Android7.1.2_r ...
- Android 亲测源码分享
Android 亲测源码分享 一.优质视频教程 1.老罗Android开发视频教程(更多经典教程制作进行中) http://www.apkbus.com/android-94796-1-1.html ...
- Android开源框架源码鉴赏:Fresco
文章目录 一 图片加载流程 1.1 初始化Fresco 1.2 获取DataSource 1.3 绑定DraweeController与DraweeHierarchy 1.4 从内存缓存/磁盘缓存/网 ...
- Android开源框架源码鉴赏:Okhttp
文章目录 一 请求与响应流程 1.1 请求的封装 1.2 请求的发送 1.3 请求的调度 二 拦截器 2.1 RetryAndFollowUpInterceptor 2.2 BridgeInterce ...
- Android 7.0 源码分析项目一期竣工啦
从 Android 入行开始,因为工作需求和解决疑难bug的原因陆陆续续的看过一些源码,但都不成系统,从2016年年底开始,在Github上建了一个Android Open Source Projec ...
- Android开源框架源码鉴赏:VirtualAPK
文章目录 一 VirtualAPK的初始化流程 二 VirtualAPK的的加载流程 三 VirtualAPK启动组件的流程 3.1 Activity 3.2 Service 3.3 Broadcas ...
最新文章
- 7a系列mrcc xilinx_【FPGA】Xilinx-7系的时钟资源与DDR3配置
- Java 9 - 17 特性解读:Java 11
- android纯白背景加灰,Android背景颜色设置为灰色而不是@android:颜色/白色
- Python的global语句
- Node — 第八天 (大事件项目接口实现二)
- 机器学习之数理统计与参数估计的相关知识总结
- 测试人员要了解的知识
- JVM——详解类加载过程
- python使用ray框架改进原有代码,实现多进程与分布式
- 从入门到进阶,这10本高分书籍,优秀数据分析师越早读完越好
- 面料经纬向、正反面判别方法
- 纪念盘古工坊开发的一款手机游戏正式发布
- OSPF vlink
- 前置条件,不变性条件,后置条件 --《java并发编程实战》
- python科学计数法的显示与转换
- k8s之ceph分布式存储
- 在公共服务器上搭建python虚拟环境
- 全国计算机c++考试,全国计算机二级考试C++精选试题及答案
- java图片转视频,附加代码以供参考
- CC1312开发板OAD外部FLASH升级笔记