分析AsyncTask的源码的过程

来源:互联网 发布:阿里云免费邮箱个人版 编辑:程序博客网 时间:2024/06/02 00:28
浩哥分享AsyncTask源码学习过程,做个记录:
  1. 问题:AsyncTask中方法的执行顺序是onPreExecute,doInBackground,onPostExecute,为什么?
  2. 问题:onPreExecute,onPostExecute 为什么在主线程,doInBackground为什么在子线程?如何切换管理的?
我们可以从源码中找到问题的答案,以下为阅读源码的过程:

入口: asyncTask.execute()方法
executeOnExecutor()方法中,执行了onPreExecute(),
exec.execute(mFuture) 线程池execute方法一定会执行run()
mFuture参数类型是FutureTask,查看内部run方法
run方法主要执行callable的call方法
callable在哪里赋值?
在FutureTask的构造方法赋值的
在asyncTask的构造方法中WorkerRunnable变量类型与FutureTask建立关系,
经查看WorkerRunnable实现了callable,查看WorkerRunnable中的实现方法call()
在call方法中,发现调用了doInBackground,call在线程池里执行的,所以doInBackground也在线程池里
执行完doInBackground后,就执行postResult(result),查看方法具体实现

使用了Handler发送MESSAGE_POST_RESULT标记的消息,
发送的对象是AsyncTaskResult,(里面携带的数据和自己和doInBackground的result)

那么
handlerMessage接收消息的地方在哪里?(通常查看handler,第一时间查看handler当前在UI线程还是子线程)

查找handler,在handlerMessage方法中,标记为MESSAGE_POST_RESULT的处理了代码块
result.mTask.finish(result.mData[0]);
经分析mTask就是当前的asyncTask对象,调用finish方法,查看finish()
经查看asyncTask的finishe()中,调用了onPostExecute()(之所以doInBackground能在线程池切换到主线程调用onPostExecute ,全因为声明在主线程的handler的handlerMessage中运行)

所以综上所述,问题一问题二就能比较清晰地解决了
0 0