`
我要阳光
  • 浏览: 59513 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

AsyncTask 源码分析

 
阅读更多

AsyncTask 异步任务,可以很方便的在应用中执行下载等可能阻塞UI Thread的任务,现在分析一下它的源码。
首先列出AsyncTask的一些核心方法和域:

public abstract class AsyncTask<Params, Progress, Result> {
  private static final int CORE_POOL_SIZE = 5;        //核心线程数 
  private static final int MAXIMUM_POOL_SIZE = 128;   //最大线程数
  private static final int KEEP_ALIVE = 1;            //超时时间,当线程数超过核心线程数时,超过这个时间的空线程就会被销毁,直到线程数等于核心线程

  private static final BlockingQueue<Runnable> sPoolWorkQueue =
    new LinkedBlockingQueue<Runnable>(10);           //用于传输和保持提交的任务。可以使用此队列与池大小进行交互

  public static final Executor THREAD_POOL_EXECUTOR =
    new ThreadPoolExecutor(CORE_POOL_SIZE, MAXIMUM_POOL_SIZE, KEEP_ALIVE,
    TimeUnit.SECONDS, sPoolWorkQueue, sThreadFactory);

  public static final Executor SERIAL_EXECUTOR = new SerialExecutor();

}


其实AsyncTask的的核心就是一个ThreadPoolExecutor ,这是一个Java的线程池,在生成AsyncTask的时候,从线程池取出一个线程来运行你的代码。

管理规则是这样的,
如果运行的线程少于 corePoolSize,则 Executor 始终首选添加新的线程,而不进行排队。

如果运行的线程等于或多于 corePoolSize,则 Executor 始终首选将请求加入队列,而不添
加新的线程。

如果无法将请求加入队列,则创建新的线程,除非创建此线程超出 maximumPoolSize,在这种情况下,任务将被拒绝。

SERIAL_EXECUTOR 是维护线程安全,将新建的任务一个一个的加入到ThreadPoolExecutor 中。

通过源码解决的一些问题:

1. API中说AsyncTask只能运行在UI Thread,是这样么?
不是的,因为在生成AsyncTask和全局的线程池时,并没有对线程进行限制,只要所在的线程存在Looper(也就是调用过Looper.prepare的线程)都可以构造AsyncTask,所以在Service,Receiver中都可以构造AsyncTask。

2. AsyncTask建立的任务,是被立即执行么?
不是立即执行,根据上述的规则,当目前已经有五个任务执行的时候,此时线程数等于corePoolSize,那么再构造的AsyncTask就会进入sPoolWorkQueue,直到sPoolWorkQueue满为止,这些线程都是被阻塞的,必须要有核心线程执行完成,他们才会执行。
有趣的是,如果sPoolWorkQueue满了,这时再进来任务,就是构造新线程,执行此任务(而不是队列中的任务),所以你建立的AsyncTask不是按照构造的顺序来执行的,很可能后构造的反而先执行了。

3. AsyncTask构造的最大数量?
默认状态,在每个进程中,可以最够同时构造138个,其中同时运行128个,10个在阻塞队列之中,如果在构造就会抛出异常。

4. 如何对AsyncTask进行优化?
THREAD_POOL_EXECUTOR 是 public static final的,所以你可以访问到这个线程池,从而动态的设定 核心线程数、最大线程数等。除非你有特殊的情况处理,否则是没有必要进行修改的。
0
1
分享到:
评论

相关推荐

    Android AsyncTask 源码解析

    代码为博客的示例代码,有问题请博客中留言:http://blog.csdn.net/lmj623565791/article/details/38614699

    Android AsyncTask源码分析

    本文先简要介绍AsyncTask的用法,然后分析具体实现。 基本用法 AsyncTask是一个抽象类,我们需要创建子类去继承它,并且重写一些方法。AsyncTask接受三个泛型参数: Params: 指定传给任务执行时的参数的类型 ...

    最全java面试题.zip

    AsyncTask源码分析 插件化技术 自定义控件 事件分发机制 ANR问题 Art和Dalvik的区别 Android关于OOM的解决方案 Fragment Activity&Fragment SurfaceView Android几种进程 APP启动过程 Activity启动流程以及界面展示...

    Java最全面试题宝典.rar

    AsyncTask源码分析 插件化技术 自定义控件 事件分发机制 ANR问题 Art和Dalvik的区别 Android关于OOM的解决方案 Fragment Activity&Fragment SurfaceView Android几种进程 APP启动过程 Activity启动流程以及界面展示...

    异步任务Asynctask源码与反编译对比

    异步任务Asynctask源码与反编译对比,来分析源代码

    Android AsyncTask完全解析 带你从源码的角度彻底理解

    我们都知道,Android UI是线程不安全的,如果想要在子线程里进行UI操作,就需要借助Android的异步消息处理机制。...不过今天我还是准备从AsyncTask的基本用法开始讲起,然后我们再来一起分析下AsyncTask源码,看看它

    Android代码-AndroidNote Android笔记

    ListView源码分析 VideoView源码分析 View绘制过程详解 网络部分 HttpURLConnection详解 HttpURLConnection与HttpClient volley-retrofit-okhttp之我们该如何选择网路框架 Volley源码分析 Retrofit详解(上) Retrofit...

    Android AsyncTask实现机制详细介绍及实例代码

    主要介绍了Android AsyncTask实现机制详细介绍及实例代码的相关资料,这里附有示例代码,帮助大家学习理解,需要的朋友可以参考下

    Android中AsyncTask与handler用法实例分析

    主要介绍了Android中AsyncTask与handler用法,以实例形式较为详细的分析了Android中AsyncTask与handler的功能、用法与相关注意事项,并附带完整实例源码供读者下载,需要的朋友可以参考下

    Android代码-Android 一些重要知识点解析整理

    Android中AsyncTak的使用与源码分析 Android AsyncTask 完全解析,带你从源码的角度彻底理解 Android 异步消息处理机制完全解析,带你从源码角度彻底理解 Android 异步消息处理机制 让你深入理解 Looper、...

    AsyncTaskDemo

    介绍了AsyncTask的使用,及源码分析。线程池,有返回值的线程。

    Android通过Handler与AsyncTask两种方式动态更新ListView(附源码)

    主要介绍了Android通过Handler与AsyncTask两种方式动态更新ListView的方法,结合实例形式分析了ListView动态更新的常用技巧,并附上完整实例源码供读者下载,需要的朋友可以参考下

    android异步消息机制 从源码层面解析(2)

    它提供了Params, Progress和 Result三个泛型参数,在下面会仔细分析这三个泛型参数的具体含义。 AsyncTask提供了四个核心方法 onPreExecute() 此方法在主线程中执行,在异步任务执行之前,此方法会被调用,一般用于...

    百度地图开发java源码-blog-backup:学习文章,也是我博客的备份

    中的实例,来分析 ViewGroup 的事件分发机制。 本章介绍 View(视图) 动画相关概念以及应用。 本篇介绍 Handler 和 Message 以及 Looper 的基本用法和工作原理。 本篇介绍 AsyncTask 的使用方法和工作原理 本篇介绍 ...

    Android开发艺术探索.任玉刚(带详细书签).pdf

    本书是一本Android进阶类书籍,采用理论、源码和实践相结合的方式来阐述高水准的Android应用开发要点。本书从三个方面来组织内容。第一,介绍Android开发者不容易掌握的一些知识点;第二,结合Android源代码和应用层...

    Android开发艺术探索

     3.4.2 事件分发的源码解析 / 144  3.5 View的滑动冲突 / 154  3.5.1 常见的滑动冲突场景 / 155  3.5.2 滑动冲突的处理规则 / 156  3.5.3 滑动冲突的解决方式 / 157  第4章 View的工作原理 / 174  4.1 初识...

    android开发资料大全

    AsyncTask进度条加载网站数据到ListView 命令行开发、编译、打包Android应用程序汇总大全 Android 动画效果二 Frame Animation 动画专题研究 Android新浪客户端开发教程(完整版)汇总大全 Android多媒体实例大汇集...

Global site tag (gtag.js) - Google Analytics