先看下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. java常用设计模式一:单例模式

     1.饿汉式 package singleton.demo; /** * @author Administrator * @date 2019/01/07 */ public class Single ...

  2. Servlet从浅入深

    Servlet是什么 servlet 是运行在 Web 服务器中的小型 Java 程序(即:服务器端的小应用程序). servlet 通常通过 HTTP(超文本传输协议)接收和响应来自 Web 客户端 ...

  3. MFC 怎样获得某个窗口的句柄?

    GetSafeHandle();this-> hWnd;GetDlgItem(hwnd,ID);//获取窗口ID所对应的HWND的子窗口句柄 在主窗口中,如果要用到父窗口的句柄,可以用 HWND ...

  4. shell 脚本,将/etc/目录下所有的软链接文件输出

    #!/bin/bash # cd /etc for a in *;do if [ -L $a ];then #如果文件存在,为软链接文件且指向的是文件,则返回真 echo $a fi done 测试:

  5. Pywinauto 基于Win32 程序的自动化功能测试工具

    1.  前提条件 ü  Python2.6 下载地址:http://ishare.iask.sina.com.cn/f/8173206.html ü  Pywinauto-0.4.1 下载地址:htt ...

  6. Elasticsearch 相关 api 操作

    A. es 操作 1. 检查 es 集群健康状态 2. 获取集群中的节点列表 3. 创建索引 4. 获取索引 5. 索引文档 6. 查询文档 7. 删除索引 8. 更新文档 9. 删除文档 10. 批 ...

  7. Quartz.net 起步

    安装 Quartz 程序包 使用 nuget 命令行安装 Quartz: Install-Package Quartz 如果使用 JSON 序列化,使用 nuget 安装 Quartz.Seriali ...

  8. Jersey构建Restful风格的webservices

    最近一直在搞老项目的开发工作,很少写博文了.听了两位阿里巴巴大牛的讨论,决定试试用restful风格的webservices看看. 这里用的是Jersey这个框架,刚开始弄,有点麻烦,只能到处查资料. ...

  9. 设计模式之组合模式(Composite Pattern)

    一.什么是组合模式? 组合模式提供了一种层级结构,并允许我们忽略对象与对象集合之间的差别 调用者并不知道手里的东西是一个对象还是一组对象,不过没关系,在组合模式中,调用者本来就不需要知道这些 二.举个 ...

  10. BitAdminCore框架更新日志20180529

    索引 NET Core应用框架之BitAdminCore框架应用篇系列 框架演示:http://bit.bitdao.cn 框架源码:https://github.com/chenyinxin/coo ...