浩哥分享AsyncTask源码学习过程,做个记录:
- 问题:AsyncTask中方法的执行顺序是onPreExecute,doInBackground,onPostExecute,为什么?
- 问题: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中运行)
所以综上所述,问题一问题二就能比较清晰地解决了