Android AsyncTask 分析内部实现

转载自:http://blog.csdn.net/jjwwmlp456/article/details/38623563

sdk3.0前,使用内部的线程池,多线程并发执行。线程池大小等于5,最大达128

sdk3.0后,使用默认的serial线程池,执行完一个线程,再顺序执行下一个线程。sdk3.0<=current version <= sdk4.3时 线程池大小等于5,最大达128

sdk4.4后线程池大小等于 cpu count + 1,最大值为cpu count * 2 + 1

sdk3.0后有两种线程池的实现,默认为 Serial 线程池

1 public static final Executor SERIAL_EXECUTOR = new SerialExecutor();
2 public static final Executor THREAD_POOL_EXECUTOR
3             = new ThreadPoolExecutor(CORE_POOL_SIZE, MAXIMUM_POOL_SIZE, KEEP_ALIVE,
4                     TimeUnit.SECONDS, sPoolWorkQueue, sThreadFactory);
5 private static volatile Executor sDefaultExecutor = SERIAL_EXECUTOR;
6 public static void setDefaultExecutor(Executor exec) {//设置默认线程池
7         sDefaultExecutor = exec;
8 }  

SerialExecutor ,使用同步锁,一次执行一个线程

 1 private static class SerialExecutor implements Executor {
 2         final ArrayDeque<Runnable> mTasks = new ArrayDeque<Runnable>();
 3         Runnable mActive;
 4
 5         public synchronized void execute(final Runnable r) {
 6             mTasks.offer(new Runnable() {
 7                 public void run() {
 8                     try {
 9                         r.run();
10                     } finally {
11                         scheduleNext();
12                     }
13                 }
14             });
15             if (mActive == null) {
16                 scheduleNext();
17             }
18 }
19
20         protected synchronized void scheduleNext() {
21             if ((mActive = mTasks.poll()) != null) {
22                 THREAD_POOL_EXECUTOR.execute(mActive);
23             }
24         }
25     }  

THREAD_POOL_EXECUTOR 并发线程池

asynctask.setDefaultExecutor(AsyncTask.THREAD_POOL_EXECUTOR); //设置使用 并发线程池

//params 都是使用在doInBackground(Params... params);

asynctask.executeOnExecutor(executor, params); //可以自定义 线程池     使用这两种方法

时间: 2024-10-16 10:38:40

Android AsyncTask 分析内部实现的相关文章

Java AsyncTask 分析内部实现

sdk3.0前,使用内部的线程池,多线程并发执行.线程池大小等于5,最大达128 sdk3.0后,使用默认的serial线程池,执行完一个线程,再顺序执行下一个线程.sdk4.3时 线程池大小等于5,最大达128 sdk4.4后线程池大小等于 cpu count + 1,最大值为cpu count * 2 + 1 sdk3.0后有两种线程池的实现,默认为 Serial 线程池 public static final Executor SERIAL_EXECUTOR = new SerialExe

Android AsyncTask分析

---恢复内容开始--- 因为android的UI线程是不安全的,如果你UI线程里执行一些耗时任务,很容易就导致程序崩溃.并且目前网络任务也不能够在UI线程里执行.处理这些问题除了直接写一个线程以外,Android还提供一个AsyncTask(异步任务类)来更简单的处理一些耗时任务. AsyncTask<>是一个抽象类,通常用于继承,继承时需要指定三个泛型参数. 1.Params:启动任务时传入的参数的类型.这是一个数组,可以传多个参数.调用时使用params[0].params[1].par

Android多线程分析之五:使用AsyncTask异步下载图像

Android多线程分析之五:使用AsyncTask异步下载图像 罗朝辉 (http://blog.csdn.net/kesalin) CC 许可,转载请注明出处 在本系列文章的第一篇<Android多线程分析之中的一个:使用Thread异步下载图像>中.曾演示了怎样使用 Thread 来完毕异步任务. Android 为了简化在 UI 线程中完毕异步任务(毕竟 UI 线程是 app 最重要的线程).实现了一个名为 AysncTask 的模板类.使用 AysncTask 能够在异步任务进行的同

源码分析Android AsyncTask

Android UI操作是线程不安全的,若想在子线程红进行UI操作,需要借助Android提供的Handler.Android提供的AsyncTask其实是对Handler的封装,方便我们在子线程中更新UI元素.AsyncTask是一个泛型类,书写格式为: AsyncTask<Params, Progress, Result>.这三个参数的用途如下: 1. Params 这三个参数的用途如下: 1. Params 在执行AsyncTask时需要传入的参数,可用于在后台任务中使用. 2. Pro

AsyncTask分析

AsyncTask分析 经典版异步任务 public abstract class MyAsyncTask { private Handler handler = new Handler(){ public void handleMessage(android.os.Message msg) { onPostExecute(); }; }; /** * 后台任务执行之前 提示用户的界面操作. */ public abstract void onPreExecute(); /** * 后台任务执行

Android AsyncTask 从源码角度解析其原理和用法

AsyncTask简介: 众所周知知道,Android UI是线程不安全的,如果要想在子线程中更新UI操作,必须使用Android的异步消息处理机制.当然我们自己可以实现一个Handler+Message消息处理机制来在子线程中更新UI操作.有时候觉得自己写这个异步消息处理机制很麻烦有木有??不过庆幸的是,Android 给我们实现了这么一套异步消息处理机制,我们直接拿来用就是了,从而 AsyncTask就诞生了.AsyncTask用于Android的异步消息 处理机制,来实现子线程和UI线程间

Android Volley分析(二)——实现

在Android Volley分析(一)--结构中主要分析了Volley的基本组件和框架结构,组件主要是定义的接口,也就是说我们可以实现这些接口来定制自己的Volley版本,比如NetWork.Cache.Request等等.Android Volley在com.android.volley.toolbox下已经做了这些工作,下面就看看这些具体的实现内容 先看一个Volley使用的例子 final TextView mTextView = (TextView) findViewById(R.id

Android多线程分析之四:MessageQueue的实现

罗朝辉 (http://blog.csdn.net/kesalin) CC 许可,转载请注明出处 在前面两篇文章<Android多线程分析之二:Thread的实现>,<Android多线程分析之三:Handler,Looper的实现>中分别介绍了 Thread 的创建,运行,销毁的过程以及 Thread与 Handler,Looper 之间的关联:Thread 在其 run() 方法中创建和运行消息处理循环 Looper,而 Looper::loop() 方法不断地从 Messag

Log中&#39;main&#39;, &#39;system&#39;, &#39;radio&#39;, &#39;events&#39;以及android log分析

在Android中不同的log写到不同的设备中,共有/dev/log/system, /dev/log/main, /dev/log/radion, /dev/log/events四中类型.其中默认Log.v等写入/dev/log/main中.Slog写入/dev/log/system中. 我们在使用logcat 抓去日至的时候, 可以指定buffer,来请求不同的环形缓冲区 ('main', 'system', 'radio', 'events',默认为"-b main -b system&q