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的源码探秘相关推荐

  1. Android Gradle Plugin 源码解析(上)

    一.源码依赖 本文基于: android gradle plugin版本: com.android.tools.build:gradle:2.3.0 gradle 版本:4.1 Gradle源码总共3 ...

  2. 【转】Android 4.3源码的下载和编译环境的安装及编译

    原文网址:http://jingyan.baidu.com/article/c85b7a641200e0003bac95a3.html  告诉windows用户一个不好的消息,windows环境下没法 ...

  3. 可视化工具gephi源码探秘(二)---导入netbeans

    在上篇<可视化工具gephi源码探秘(一)>中主要介绍了如何将gephi的源码导入myeclipse中遇到的一些问题,此篇接着上篇而来,主要讲解当下通过myeclipse导入gephi源码 ...

  4. android编译.a文件,Android 7.1源码编译导入AS完整教程

    本教程仅针对Android 7.1系统,为便于虚拟机备份和出现问题时的还原,本教程分为3步:初始化编译环境.源码同步.编译源码导入Android Studio. 编译源码:Android7.1.2_r ...

  5. Android 亲测源码分享

    Android 亲测源码分享 一.优质视频教程 1.老罗Android开发视频教程(更多经典教程制作进行中) http://www.apkbus.com/android-94796-1-1.html ...

  6. Android开源框架源码鉴赏:Fresco

    文章目录 一 图片加载流程 1.1 初始化Fresco 1.2 获取DataSource 1.3 绑定DraweeController与DraweeHierarchy 1.4 从内存缓存/磁盘缓存/网 ...

  7. Android开源框架源码鉴赏:Okhttp

    文章目录 一 请求与响应流程 1.1 请求的封装 1.2 请求的发送 1.3 请求的调度 二 拦截器 2.1 RetryAndFollowUpInterceptor 2.2 BridgeInterce ...

  8. Android 7.0 源码分析项目一期竣工啦

    从 Android 入行开始,因为工作需求和解决疑难bug的原因陆陆续续的看过一些源码,但都不成系统,从2016年年底开始,在Github上建了一个Android Open Source Projec ...

  9. Android开源框架源码鉴赏:VirtualAPK

    文章目录 一 VirtualAPK的初始化流程 二 VirtualAPK的的加载流程 三 VirtualAPK启动组件的流程 3.1 Activity 3.2 Service 3.3 Broadcas ...

最新文章

  1. 7a系列mrcc xilinx_【FPGA】Xilinx-7系的时钟资源与DDR3配置
  2. Java 9 - 17 特性解读:Java 11
  3. android纯白背景加灰,Android背景颜色设置为灰色而不是@android:颜色/白色
  4. Python的global语句
  5. Node — 第八天 (大事件项目接口实现二)
  6. 机器学习之数理统计与参数估计的相关知识总结
  7. 测试人员要了解的知识
  8. JVM——详解类加载过程
  9. python使用ray框架改进原有代码,实现多进程与分布式
  10. 从入门到进阶,这10本高分书籍,优秀数据分析师越早读完越好
  11. 面料经纬向、正反面判别方法
  12. 纪念盘古工坊开发的一款手机游戏正式发布
  13. OSPF vlink
  14. 前置条件,不变性条件,后置条件 --《java并发编程实战》
  15. python科学计数法的显示与转换
  16. k8s之ceph分布式存储
  17. 在公共服务器上搭建python虚拟环境
  18. 全国计算机c++考试,全国计算机二级考试C++精选试题及答案
  19. java图片转视频,附加代码以供参考
  20. CC1312开发板OAD外部FLASH升级笔记

热门文章

  1. 自动驾驶相关术语(一)
  2. [Golang]搭建gdb调试go程序
  3. 气传导耳机怎么样?最好的气传导耳机推荐
  4. 【电子学会】2021年09月图形化三级 -- 接红包游戏
  5. 通过国家码切换默认输入法
  6. 线程安全第一期○CSA乐观锁
  7. 手机端访问网页自动跳转至广告页面解决办法
  8. 第五章:数学运算-random:伪随机数生成器-生成随机数
  9. c语言不安全库_C语言安全性缺陷
  10. JavaFX Button常用相关属性和制作多边形按钮Button