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的,所以你可以访问到这个线程池,从而动态的设定 核心线程数、最大线程数等。除非你有特殊的情况处理,否则是没有必要进行修改的。
分享到:
相关推荐
**Android AsyncTask 源码解析** AsyncTask 是 Android 平台上一个非常重要的工具类,用于在后台线程执行耗时操作,然后在 UI 线程更新结果,从而避免了因长时间运行任务而导致的 ANR(Application Not Responding...
Android的AsyncTask是一个轻量级的异步任务框架,它被设计用来简化在主线程与后台线程之间进行数据交互的复杂性。由于Android的UI更新必须在主线程中进行,AsyncTask通过内部封装Handler和线程池,使得开发者可以在...
AsyncTask源码分析 插件化技术 自定义控件 事件分发机制 ANR问题 Art和Dalvik的区别 Android关于OOM的解决方案 Fragment Activity&Fragment SurfaceView Android几种进程 APP启动过程 Activity启动流程以及界面展示...
AsyncTask源码分析 插件化技术 自定义控件 事件分发机制 ANR问题 Art和Dalvik的区别 Android关于OOM的解决方案 Fragment Activity&Fragment SurfaceView Android几种进程 APP启动过程 Activity启动流程以及界面展示...
本文将深入探讨 AsyncTask 的内部实现原理、工作流程以及关键代码分析。 首先,AsyncTask 有三个泛型参数,分别代表输入参数类型(Params)、进度更新参数类型(Progress)和结果参数类型(Result)。通过这些参数...
- **AsyncTask源码分析** - AsyncTask是一个轻量级的异步任务执行框架。 - **核心方法**: - `doInBackground(Params...)`: 在后台线程执行的任务。 - `onPostExecute(Result)`: 在UI线程执行,用于更新UI。 - *...
3. **AsyncTask源码分析**: AsyncTask是一种轻量级的异步任务处理框架,它提供了简单的接口来执行后台任务并在UI线程更新结果。源码中涉及了线程池、内部类和泛型等概念,需要注意的是,Android版本更新后,...
此外,源码分析还包括对Android框架组件的理解,如Intent、Fragment、Loader、AsyncTask等,这些是构建复杂应用的基础。 二、集合类的深入理解和优化 在Android开发中,集合类(如ArrayList、LinkedList、HashMap...
在Android应用开发中,异步任务(AsyncTask)是一个常用工具,用于在后台线程执行耗时操作,然后在UI线程...通过分析这个示例,开发者可以更好地理解和掌握AsyncTask的工作原理,以便在自己的项目中有效利用这一工具。
- 分析`app`目录下的`src/main/java`,找到`MainActivity`类,查看如何创建并启动AsyncTask。 - 查看`MyAsyncTask`类,了解各个方法的具体实现。 - 跟踪代码,理解数据如何从后台传递到前端,以及UI如何更新。 -...
"Android上百实例源码分析以及开源分析"集合提供了一系列实例,旨在帮助开发者更好地掌握Android应用开发的核心技术和最佳实践。这个资源包涵盖了多种Android应用开发中的常见问题和解决方案,通过实例源码,开发者...
通过分析和运行这段代码,我们可以更深入地理解这两个组件的使用方法和它们之间的差异。 在实际应用中,`android-async-http`提供了更强大的网络请求功能,如自定义请求头、支持多种HTTP方法等,而`AsyncTask`则更...
《Android应用源码解析:AsyncTask_Download2.zip》 在Android开发中,AsyncTask是一个常用的工具类,用于处理轻量级的异步任务。它为开发者提供了在后台线程执行任务并在UI线程更新结果的便利。这个压缩包...
这个源码示例“Android应用源码之AsyncTask_Download1)”很可能是一个简单的下载任务实现,利用了AsyncTask来处理网络下载。让我们深入探讨AsyncTask及其在Android中的使用。 AsyncTask是Android提供的一个轻量级...
在Android开发中,异步操作类AsyncTask是一个...通过阅读和分析AsyncTask的源码,我们可以学习到如何管理线程、如何调度任务以及如何在主线程与后台线程之间安全地交互数据,这些都是Android开发中不可或缺的基础技能。
这个压缩包"Android_上百实例源码分析以及开源分析_集合打包5"显然包含了大量关于Android编程的实例源码和开源项目的分析资料,旨在帮助开发者拓宽视野,增强实战经验。下面我们将详细探讨其中可能涵盖的知识点。 1...
本项目"Android应用源码之AsyncTask_Download2_应用.zip"显然是一个以AsyncTask实现文件下载功能的示例代码。下面我们将深入探讨AsyncTask以及如何在Android中实现文件下载。 AsyncTask是Android SDK提供的一种轻量...
通过分析和学习`AsyncTask_Download2`源码,我们可以深入了解Android中如何优雅地处理后台任务,特别是对于文件下载这种耗时操作。同时,这也有助于理解Android的多线程编程,提升应用性能和用户体验。
博客可能涵盖了AsyncTask的源码分析,如何避免内存泄漏,以及如何正确取消AsyncTask等主题。通过深入学习,你可以更好地掌握如何在实际项目中有效地使用AsyncTask。 在提供的"testAsync"文件中,可能包含了一些示例...