先看下Java Threading Framework的类图:
 
     Callable与Runnable类似,差别在Callable具有返回值,共同点是两个都是执行体,一般都抽象为任务处理。
Future抽象了任务生命周期维护行为,如获取结果、取消、判断执行状态。Java现有的Thread Framework均基于Runnable,RunnableFuture通过继承Future和Runnable呈现上述行为,但RunnabeFuture未定义具体的任务,FutureTask便增加了该属性,它是一个完整的任务抽象:任务自身(Callable)、任务载体(Runnable)、任务结果维护(Future)。
     Executor的设计主要为了解决传统任务提交和任务处理耦合的问题,它将任务提交、任务处理解耦,便于任务调度策略的处理。
AbstractExecutorService对任务提交、执行解耦做了细化,提供了submit接口,并给caller反馈Future对象,便于caller获知result
Executor和AbstractExecutorService均未定义线程提交后该如何schedule、如何执行,这个可以有很多实现方法,ThreadPoolExecutor便是其中
比较主流的一种:线程池管理方式。
     具体的实现可参看jdk或android中libcore源码,此处不累赘,下面主要讨论Android中的异步线程类AsyncTask,它便是基于Java的Thread Framework做的封装,我们可以看下AsyncTask的类图(基于Android API 22):
     
        可以看到AsyncTask本质上是一个FutureTask+Executor, 提供了两个默认执行器:SERIAL_EXECUTOR和THREAD_POOL_EXECUTOR,如下:
        从Android 3.0 (API Level 13)之后,AsyncTask默认采用SERIAL_EXECUTOR, 即单线程执行策略,但是它并不是单独启动一个线程处理,其执行载体仍然是THREAD_POOL_EXECUTOR,只是控制为每次只执行一个任务,因此仍然可能会出现TASK Rejected的问题。
       AsyncTask的任务提交均在UI线程执行,其流程如下:
       
     可以看到任务的真正执行实体是FutureTask,它在executor的执行是异步的,具体实现可以参考线ThreadPoolExecutor执行
任务的流程,此处不赘述,mFuture的实现如下:
     
     doIngBackground由AsyncTask子类override实现,此处postResult是通过handler将消息传到UI线程的消息队列,
此处getHandler()对应的是UI线程looper,handleMessage的处理就已经转到UI Thread了。
至此,AsyncTask从提交、执行、反馈结果的流程执行完毕,总结一下:
1.AsyncTask聚合了FutureTask和Executor,将Threading Framework的实现屏蔽在Framework层,APP侧只要傻傻地override
onPreExecute、doInbackground、onPostExecute即可,大大便利APP层对异步任务的使用需求。
2.按照谷歌官网说法,AsyncTask比较适合short time asynchronous task execution, 如果任务比较耗时,还是建议直接使用
Threading Framework提供的api,创建合适的executor。
3.默认的串行执行器并非单独开辟一个线程,仍以AsyncTask内置的线程池执行器为执行载体,因此仍然会存在被拒绝的可能性。
 
Ref:

AsyncTask的前世今生的更多相关文章

  1. 【调侃】IOC前世今生

    前些天,参与了公司内部小组的一次技术交流,主要是针对<IOC与AOP>,本着学而时习之的态度及积极分享的精神,我就结合一个小故事来初浅地剖析一下我眼中的“IOC前世今生”,以方便初学者能更 ...

  2. [C#] 回眸 C# 的前世今生 - 见证 C# 6.0 的新语法特性

    回眸 C# 的前世今生 - 见证 C# 6.0 的新语法特性 序 目前最新的版本是 C# 7.0,VS 的最新版本为 Visual Studio 2017 RC,两者都尚未进入正式阶段.C# 6.0 ...

  3. Android 旋转屏幕--处理Activity与AsyncTask的最佳解决方案

    一.概述 运行时变更就是设备在运行时发生变化(例如屏幕旋转.键盘可用性及语言).发生这些变化,Android会重启Activity,这时就需要保存activity的状态及与activity相关的任务, ...

  4. docker4dotnet #1 – 前世今生 & 世界你好

    作为一名.NET Developer,这几年看着docker的流行实在是有些眼馋.可惜的是,Docker是基于Linux环境的,眼瞧着那些 java, python, node.js, go 甚至连p ...

  5. Atitit 智能云网络摄像机的前世今生与历史 优点  密码默认888888

    Atitit 智能云网络摄像机的前世今生与历史 优点  密码默认888888 用户名admin  密码aaaaaa 网络摄像机是一种结合传统摄像机与网络技术所产生的新一代摄像机,它可以将影像通过网络传 ...

  6. Android笔记——AsyncTask介绍

    AsyncTask和Handler对比 1 ) AsyncTask实现的原理,和适用的优缺点 AsyncTask,是android提供的轻量级的异步类,可以直接继承AsyncTask,在类中实现异步操 ...

  7. Android线程管理之AsyncTask异步任务

    前言: 前面几篇文章主要学习了线程以及线程池的创建与使用,今天来学习一下AsyncTask异步任务,学习下AsyncTask到底解决了什么问题?然而它有什么弊端?正所谓知己知彼百战百胜嘛! 线程管理相 ...

  8. Android中使用AsyncTask实现文件下载以及进度更新提示

    Android提供了一个工具类:AsyncTask,它使创建需要与用户界面交互的长时间运行的任务变得更简单.相对Handler来说AsyncTask更轻量级一些,适用于简单的异步处理,不需要借助线程和 ...

  9. 阶段一:AsyncTask的三个属性值和四个步骤

    “阶段一”是指我第一次系统地学习Android开发.这主要是对我的学习过程作个记录. 最近学到用AsyncTask来处理有关网络的操作.虽然代码看上去不是很复杂,但仍有很多地方有疑惑.所以研读了一下A ...

随机推荐

  1. Linux服务器部署系列之一—Apache篇(下)

    接上篇 linux服务器部署系列之一—Apache篇(上)    四.管理日志文件 Apache日志分为访问日志和错误日志两种: 1)访问日志 用于记录客户端的访问信息,文件名默认为access_lo ...

  2. MATLAB矩阵的一些用法

    1.怎样去提取和修改矩阵中的一个元素. (1)创建一个矩阵 >> A=[1,2,3,4;5,6,7,8;9,10,11,12;13,14,15,16]A =     1     2     ...

  3. python编码(三)

    python 有str object 和 unicode object 两种字符串,都可以存放字符的字节编码,但是他们是不同的type,这一点很重要,也是为什么会有encode(编码)和decode( ...

  4. struts2 file

    JavaBean 中: private File[] pic; private String[] picContentType; private String [] picFileName; sett ...

  5. centos yum command

    yum repolist all -- 列出所有仓库 yum list all -- 列出仓库中所有软件包 yum info package-name -- 查看软件包信息 yum install p ...

  6. Vivado级联Modelsim仿真Re-launch问题

    前两天在群里看到有朋友说Vivado级联Modelsim仿真出现修改设计代码后重新run do文件,波形没有随着代码修改而改变,这个问题博主之前没有注意到,因为把Vivado和Modelsim级联好后 ...

  7. hdu 5009 离散化

    http://acm.hdu.edu.cn/showproblem.php?pid=5009 有一段序列,涂连续一段子序列的代价为该子序列出现不同数字个数的平方,求最小代价涂完整个序列. ai有10^ ...

  8. 获得硬盘的ID序列号(XE10.1+WIN8.1)

    疯狂delphi DelphiXE公开课群:100162924.58593121 朱建强QQ:513187410 获得硬盘的ID序列号(XE10.1+WIN8.1) 相关资料: https://zhi ...

  9. Android-ColorsUtil工具类

    颜色工具类 public class ColorsUtil { private ColorsUtil() { throw new Error("Do not need instantiate ...

  10. Linux SSH无密码登录

    Linux服务器常见的登录方式有两种:密码登录.秘钥登录.工作中我们最常使用的是用秘钥登录的方法,因为使用秘钥登录更高效.更安全. 如何实现SSH无密码登录: 原理:无密码ssh登录的主要操作为将本机 ...