AsyncTask的前世今生

Callable与Runnable类似,差别在Callable具有返回值,共同点是两个都是执行体,一般都抽象为任务处理。

设计Future是对任务处理结果的生命周期维护行为,提供获取结果、取消、判断执行状态。Java现有的Thread Framework均基于Runnable,RunnableFuture提供了这样的抽象:可以借助Thread执行,并可维护执行结果。RunnableFuture中体现中设计了任务的载体(通过继承Runnable,可依托Thread Framework),任务的处理结果维护,而具体的任务则未定义,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:

http://developer.android.com/reference/android/os/AsyncTask.html

时间: 2024-10-18 16:31:08

AsyncTask的前世今生的相关文章

理解ANR的前世今生,解决ANR就是这么简单!

1. 什么是ANR? ANR(Application Not Responding)即应用程序无响应. 2. ANR产生的原因是什么? ANR产生的根本原因是APP阻塞了UI线程.在android系统中每个App只有一个UI线程,是在App创建时默认生成的,UI线程默认初始化了一个消息循环来处理UI消息,ANR往往就是处理UI消息超时了.那么UI消息来源有哪些呢?主要有两种来源: 2.1 来自于AMS的回调消息 在Android系统中,应用程序是有Android的四大组件组成,AMS负责对应用程

Android 性能篇 -- 带你领略Android内存泄漏的前世今生

基础了解 什么是内存泄漏? 内存泄漏是当程序不再使用到的内存时,释放内存失败而产生了无用的内存消耗.内存泄漏并不是指物理上的内存消失,这里的内存泄漏是指由程序分配的内存但是由于程序逻辑错误而导致程序失去了对该内存的控制,使得内存浪费. Java 内存分配策略 Java 程序运行时的内存分配策略有三种,分别是 静态分配 . 栈式分配 和 堆式分配 ,对应的三种存储策略使用的内存空间主要分别是 静态存储区(也称方法区) . 栈区 和 堆区 . ?? 静态存储区(方法区):主要存放 静态数据 . 全局

Handler, AsyncTask用法简单示例

package com.jim.testapp; import android.app.Activity; import android.os.AsyncTask; import android.os.Handler; import android.os.Message; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.util.Log; import androi

Android异步加载全解析之使用AsyncTask

Android异步加载全解析之使用AsyncTask 概述 既然前面提到了多线程,就不得不提到线程池,通过线程池,不仅可以对并发线程进行管理,更可以提高他们执行的效率,优化整个App.当然我们可以自己创建一个线程池,不过这样是很烦的,要创建一个高效的线程池还是挺费事的,不过,Android系统给我吗提供了AsyncTask这样一个类,来帮助我们快速实现多线程开发,它的底层实现,其实就是一个线程池. AsyncTask初探 AsyncTask,顾名思义就是用来做异步处理的.通过AsyncTask,

Git前世今生-版本控制软件的发展

版本控制软件发展至今已有40多年的历史. 最早的版本控制软件是1972年由Marc J. Rochkind开发的SCCS (Source Code Control System),通过将不同版本下的文件单独保存的形式完成,将同一版本的所有文件打包保存.SCCS使用了长达10年的时间,直到1982年RCS的问世. 1982年,Walter F.Tichy 发布了RCS (Revision Control System),提供了较SCCS更多的功能,并作为GNU项目的一部分. 1986年创建的CVS

android Asynctask的优缺点?能否同时并发100+asynctask呢?

一  Asynctask的优缺点? AsyncTask,是android提供的轻量级的异步类,可以直接继承AsyncTask,在类中实现异步操作,并提供接口反馈当前异步执行的程度(可以通过接口实现UI进度更新),最后反馈执行的结果给UI主线程. 优点: 1.简单,快捷 2.过程可控 3.使用的缺点: 缺点: 在使用多个异步操作和并需要进行Ui变更时,就变得复杂起来. Android的AsyncTask比Handler更轻量级一些,适用于简单的异步处理. 首先明确Android之所以有Handle

AsyncTask实现网络图片的异步加载

想要实现网络中图片的加载,主线程是不行的,方法有两个,一个是使用线程Tread(),另一个就是使用AsyncTask,AsyncTask其实也是线程.我看过慕课网里边一个叫做<Android必学-异步加载>的视频,部分代码: 1 //-----------------------AsyncTask异步访问图片----------------------- 2 3 public void showImageByAsyncTask(ImageView imageView,String url){

Android 屏幕旋转 处理 AsyncTask 和 ProgressDialog 的最佳方案

出处:http://blog.csdn.net/lmj623565791/article/details/37936275 1.概述 众所周知,Activity在不明确指定屏幕方向和configChanges时,当用户旋转屏幕会重新启动.当然了,应对这种情况,Android给出了几种方案: a.如果是少量数据,可以通过onSaveInstanceState()和onRestoreInstanceState()进行保存与恢复. Android会在销毁你的Activity之前调用onSaveInst

NetScaler SDWAN 的前世今生

                                                   论 NetScaler SDWAN 的前世今生 首先知道Citrix 思杰公司的人都知道Citrix 的网络产品线 有两款产品 ADC 应用交付平台产品-NetScaler 另外还有一款广域网优化的产品 这个名字可就变化频繁了 – 从WANScaler – Repeater – CloudBridge 到NetScaler SDWAN 平台产品.有很多人也许会产生一些困惑,是不是思杰公司有一个"