今天指导一同事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用法,分析总结了Async Task类的功能、特点及相关的使用技巧与注意事项,需要的朋友可以参考下
本文先简要介绍AsyncTask的用法,然后分析具体实现。 基本用法 AsyncTask是一个抽象类,我们需要创建子类去继承它,并且重写一些方法。AsyncTask接受三个泛型参数: Params: 指定传给任务执行时的参数的类型 ...
主要介绍了Android中AsyncTask与handler用法,以实例形式较为详细的分析了Android中AsyncTask与handler的功能、用法与相关注意事项,并附带完整实例源码供读者下载,需要的朋友可以参考下
我们都知道,Android UI是线程不安全的,如果想要在子线程里进行UI操作,就需要借助Android的异步消息处理机制。...不过今天我还是准备从AsyncTask的基本用法开始讲起,然后我们再来一起分析下AsyncTask源码,看看它
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 ...
面部分析仪此Android应用程序的目的是使用Microsoft Face API不仅检测图像中的单个面Kong,而且还提供有关每张面Kong的面部属性的信息,例如情绪,... 拍照后,您可以按“处理”按钮,该应用程序将使用AsyncTask和Mi
具体分析如下: swoole重新定义PHP语言的高性能网络通信框架,提供了PHP语言的异步多线程服务,下面的实例就可以证实这一功能。 一般来说,Swoole提供了PHP语言的异步多线程服务器,异步TCP/UDP网络客户端,异步MySQL...
中的实例,来分析 ViewGroup 的事件分发机制。 本章介绍 View(视图) 动画相关概念以及应用。 本篇介绍 Handler 和 Message 以及 Looper 的基本用法和工作原理。 本篇介绍 AsyncTask 的使用方法和工作原理 本篇介绍 ...