先看下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. 2018.06.29 洛谷P2890 [USACO07OPEN]便宜的回文(简单dp)

    P2890 [USACO07OPEN]便宜的回文Cheapest Palindrome 时空限制 1000ms / 128MB 题目描述 Keeping track of all the cows c ...

  2. HDU 2089 不要62 (递推+暴力或者数位DP)

    题意:中文题. 析:暴力先从1到1000000,然后输出就好了. 代码如下: #include <iostream> #include <cstdio> #include &l ...

  3. WCF客户端第一请求server特别慢,解决办法

    最近开发WCF应用的客户端,第一连接WCF后,请求数据返回的速度特别慢,不知道原因如何.最后改了下系统生成的APP.Config文件就好了,原来没有useDefaultWebProxy的选项,没有的时 ...

  4. HDU1065 I Think I Need a Houseboat 2016-07-24 13:59 101人阅读 评论(0) 收藏

    I Think I Need a Houseboat Problem Description Fred Mapper is considering purchasing some land in Lo ...

  5. poj 2591 Set Definition

    题目 这道题是个水题,写博客上的人好像都不屑于写这这道题.但是我为什么还是觉得挺难的呢? 我也是看了别人的博客才过了的,感觉这种写法很新颖,这样就可以不用在排序了. 下面给出正解: #include& ...

  6. hdu 5000 共存问题->背包

    http://acm.hdu.edu.cn/showproblem.php?pid=5000 每只羊有n个属性 下面n个数字表示每个属性的值范围为[ 0, T[i] ] 对于羊圈里的a羊和b羊,若a羊 ...

  7. spring案列——xml配置

    一.需要的jar包 spring.jar(官网下载) commons-logging.jar 二.项目结构 三.entity(实体类) package com.team.model; public c ...

  8. java socket编程(也是学习多线程的例子)详细版----转

    7.2 面向套接字编程    我们已经通过了解Socket的接口,知其所以然,下面我们就将通过具体的案例,来熟悉Socket的具体工作方式 7.2.1使用套接字实现基于TCP协议的服务器和客户机程序  ...

  9. [Ubuntu Version] 如何在terminal 查看当前 ubuntu的版本号

    命令: locate locate /etc/*release/etc/lsb-release/etc/os-release 命令: catcat /etc/os-releaseNAME=" ...

  10. log.debug(e.getMessage());

    private static final Log log = LogFactory.getLog(AbcAction.class); @ManagedProperty(name = "abc ...