今天指导一同事AsyncTask的使用, 然后果断被反指导了. 所以上来记录一下.
先说一下用AsyncTask时要注意的:
1. AsyncTask要与主线程有交互.
读代码的时候, 看到有人拿AsyncTask当Thread来用, 实际上是没用到位. 为什么说一定要与主线程有交互? 因为这就是AsyncTask存在的意义. 如果不需要与主线程有交互, 那纯纯的Thread就能解决问题了.
拿官方文档的话来解释就是: AsyncTask enables proper and easy use of the UI thread. This class allows to perform background operations and publish results on the UI thread without having to manipulate threads and/or handlers.
2. AsyncTask下的四个关键方法, 执行在两个不同的线程中.
a. onPreExecute(), onProgressUpdate(), 以及onPostExecute()系执行在UI thread中;
b. doInBackground则执行在一个独立的线程中.
再引用一下官方的话: 官方的话太长了, 去这里找吧:
http://developer.android.com/reference/android/os/AsyncTask.html
接下来跟着源码的执行, 来尝试分析下AsyncTask, 主要是线程归属方面的东西:
1. 首先当然是入口execute(), 进去方法里就能看到onPreExecute(). 不用说, onPreExecute()归主线程;
2. 接下来, 还是execute()下面的代码, 注意这么一行:
sExecutor.execute(mFuture);
这里的让一个ThreadPoolExecutor去execute()一个FutureTask, 这里做的是什么? 暂且不急着解释. 我们先看看在mFuture里面, 装的是什么东西.
a. 找到AsyncTask的构造方法, 可以发现mFuture在这里构造时, 所带的参数就是mWorker;
b. 也就是说, 当到sExecutor执行mFuture的时候, 实际上就是新启动了一个线程, 执行了mWorker;
c. 再看mWorker, 在它的call()方法下面, 果断调用了doInBackground(). 由此可知, doInBackground(), 实际执行在一个独立的非UI线程下面;
d. 在doInBackground()调用之后, 将有结果返回. 于是可以通过mFuture下的get()方法, 取到doInBackground()的运行结果;
e. get()到result后, 通过sHandler, 将result发送给AsyncTask.finish();
f. 终于, 在finish()方法下, 看到了久违的onPostExecute(). 由于AsyncTask是由主线程创建, 从而可知执行在AsyncTask.finish()方法下的onPostExecute(), 也属于主线程.
回到前文"暂且不急着解释"的地方, 是否发现, 此处已不存在疑问了? 随着对mFuture代码的走读, 其他部分的逻辑也清晰了起来.
3. 讲到这里貌似应该完了, 回头看看, 还落下了onProgressUpdate().
这个简单, 想想我们要更新进度时, 需要调用publishProgress(), 一切就明了了. 查看源码, 在publishProgress()中, 向sHandler发送了一条消息, 从而调用了onProgressUpdate(). 那么, onProgressUpdate()属于主线程.
相关推荐
Android开发中,异步处理是必不可少的,尤其是当涉及到与用户界面交互时。AsyncTask和Handler是Android系统提供的两种主要的异步处理机制,用于在后台线程执行耗时操作,避免阻塞UI线程。 **AsyncTask** 是一个轻量...
在深入探讨 AsyncTask 的源码之前,我们首先需要理解它的基本用法和工作原理。 ### 1. AsyncTask 的基本使用 AsyncTask 通常包含三个泛型参数:`Params`(输入参数类型)、`Progress`(后台执行过程中的进度类型)...
本文总结分析了Android中异步类AsyncTask用法。分享给大家供大家参考,具体如下: 最近整理笔记的时候,看到有关AsyncTask不是很理解,重新疏导了一下,有在网上找了一些资料,个人不敢独享,一并发在这里与大家共勉...
首先,我们来看AsyncTask的基本用法。AsyncTask有三个泛型参数:Params(参数类型),Progress(进度类型)和Result(结果类型)。要使用AsyncTask,你需要创建一个继承自AsyncTask的子类,并重写以下关键方法: 1....
在Android开发中,异步操作是必不可少的一部分,用于提升应用的性能和用户体验。...通过分析`HandlerThreadDemo`、`AsyncTaskDemo`和`HandlerDemo`的代码,可以更深入地了解这些组件的用法和实现细节。
我们都知道,Android UI是线程不安全的,如果想要在子线程里进行UI操作,就需要借助Android的异步消息处理机制。...不过今天我还是准备从AsyncTask的基本用法开始讲起,然后我们再来一起分析下AsyncTask源码,看看它
通过分析代码,我们可以学习到如何将API的使用与`AsyncTask`相结合,从而优化Android应用的性能,提高用户体验。 总之,`AsyncTask`是Android中处理异步任务的关键工具,而API则为开发者提供了与服务器进行数据交换...
Bitmap的分析与使用 热修复的原理 AIDL Binder机制 Zygote和System进程的启动过程 Android中的MVC,MVP和MVVM MVP Android开机过程 Retrofit源码分析 Glide源码分析 EventBus用法详解 EventBus源码分析 Android ORM ...
Bitmap的分析与使用 热修复的原理 AIDL Binder机制 Zygote和System进程的启动过程 Android中的MVC,MVP和MVVM MVP Android开机过程 Retrofit源码分析 Glide源码分析 EventBus用法详解 EventBus源码分析 Android ORM ...
本压缩包文件包含的“handler&looper”可能与AsyncTask如何利用Handler和Looper进行UI交互有关。 AsyncTask的核心在于它的三个泛型参数:Params、Progress和Result,分别代表了执行任务所需的输入参数类型、任务...
5. **多线程**:掌握AsyncTask,Handler,Looper,Thread以及Runnable的用法,理解Android应用中的线程模型。 6. **服务(Service)**:学习如何启动和绑定服务,理解服务的生命周期,以及服务在后台运行的应用场景。...
然后在Activity中,我们创建一个ArrayAdapter,并将数据源(如字符串数组)与默认布局绑定到ListView上: ```java myListView.setAdapter(new ArrayAdapter(this, android.R.layout.simple_list_item_1, strs));...
6. **多线程与异步处理**:Android应用通常使用Handler、AsyncTask或RxJava等技术处理耗时操作,避免阻塞主线程。分析相关代码有助于掌握异步编程技巧。 7. **权限管理**:Android 6.0以后引入了运行时权限管理,...
5. **使用ProgressBar与AsyncTask**: - 在执行耗时操作如网络请求时,可以结合AsyncTask显示和隐藏ProgressBar,提供更好的用户体验。 6. ** ProgressBar与Loader API**: - 在Android的Loader框架中,...
分析这些类的构造函数、生命周期方法、以及调用的其他接口,了解它们在系统中的作用。同时,关注重要的回调函数,这些函数往往在特定事件发生时被触发。 5. **数据结构和算法** 分析源码中的数据结构,如链表、...
《Android核心分析》一书深入探讨了Android操作系统的核心机制与技术细节,涵盖了Android系统的各个方面,旨在帮助开发者和爱好者更深入地理解Android系统的工作原理。在Android开发中,掌握这些核心概念和技术是至...
这就是`AsyncTask`的作用。 `AsyncTask`是Android提供的一个轻量级的后台处理框架,它允许开发者在后台执行任务并提供进度更新,同时在任务完成时能够安全地更新UI。`AsyncTask`有三个泛型参数:`Params`、`...
- 线程池与AsyncTask:掌握线程池的使用,对比AsyncTask的优缺点。 4. **性能优化** - 内存优化:如何避免内存泄漏,理解LeakCanary的工作原理。 - 性能监控:使用Profiler工具进行CPU、内存、网络等性能分析。 ...
5. **AsyncTask与线程管理**:Android中的异步任务处理,如使用AsyncTask或Handler/Looper机制,是避免阻塞主线程的关键。源码阅读能帮助我们理解多线程在Android中的实现方式。 6. **Service生命周期**:Service是...