AsyncTask源码分析
2016-04-28 12:04
399 查看
前置内容:Callable、Future、FutureTask
Executor子类的execute方法接收一个Runnable作为参数,会在新线程中执行Runnable中的任务,ScheduledthreadPollExecutor也可以submit任务,参数可以是Runnable或者Callable。Callable可以理解为待返回值的Runnable。FutureTask继承了Runnable和Future,既有Runnable功能也有Future功能。那么Executor的execute方法就可以把FutureTask的实例作为参数去执行。
WorkerRunnable是一个抽象类,实现了Callable
mWorker是AsyncTask的一个变量,直接实例化的WorkerRunnable并复写了Callable的call方法,call方法调用了doInBackground。重要的一点是mWorker是一个Callable对象,而FutureTask可以接收一个Callable对象的实例作为参数。
mFuture是AsyncTask的一个变量,同时是一个FutrueTask对象,接收一个Callable类型的对象作为参数,而mWorker就是一个Callable的一个实例,mFutrue就是将mWorker最为参数实例化的FutureTask的对象。mFuture复写了
而doInBackground是在
再来看看InternalHandler,看它的构造,参数是Looper.getMainLooper(),和主线程绑定的Looper,那么这个Handler发送的消息会被主线程处理(关于Handler的解析,以后会写一篇关于这这方面的博客,这里就不解释Handler相关的东西了)。
再回去看
在InternalHandler的handlerMessage方法中调用了result(AsyncTaskResult)对象的mTask(AsyncTask自身)的finish方法。我们再去看finish方法:
如果任务没被取消,finish会走到else分支,调用了onPostExecute,交给主线程处理了。
整个过程分析完了,自我感觉逻辑还是挺清晰的,按照AsyncTask的运行顺序来解析的。
Executor子类的execute方法接收一个Runnable作为参数,会在新线程中执行Runnable中的任务,ScheduledthreadPollExecutor也可以submit任务,参数可以是Runnable或者Callable。Callable可以理解为待返回值的Runnable。FutureTask继承了Runnable和Future,既有Runnable功能也有Future功能。那么Executor的execute方法就可以把FutureTask的实例作为参数去执行。
WorkerRunnable是一个抽象类,实现了Callable
mWorker是AsyncTask的一个变量,直接实例化的WorkerRunnable并复写了Callable的call方法,call方法调用了doInBackground。重要的一点是mWorker是一个Callable对象,而FutureTask可以接收一个Callable对象的实例作为参数。
mFuture是AsyncTask的一个变量,同时是一个FutrueTask对象,接收一个Callable类型的对象作为参数,而mWorker就是一个Callable的一个实例,mFutrue就是将mWorker最为参数实例化的FutureTask的对象。mFuture复写了
done()方法,
done()方法是任务执行完毕后的回调。
get()方法是获得FutureTask的运行结果。
done()方法中调用postResultIfNotInvoked(get())就是将Future的运行结果作为参数调用postResultIfNotInvoked方法,但是这个方法有一个条件
if(!wasTaskInvoked),条件成立才会执行
postResult,而
mWorker的
call方法中先把
wasTaskInvoked设置成了true,这样postResultIfNotInvoked正常情况下是不会执行的,
mFuture的
done()方法直接忽略。
而doInBackground是在
mWorker的
call方法中执行的,最后调用
postResult()
postResult()中调用了
getHandler()方法。
getHandler()方法实例化了一个InternalHandler对象,是个单例。
再来看看InternalHandler,看它的构造,参数是Looper.getMainLooper(),和主线程绑定的Looper,那么这个Handler发送的消息会被主线程处理(关于Handler的解析,以后会写一篇关于这这方面的博客,这里就不解释Handler相关的东西了)。
再回去看
postResult()方法,它就是想handler发送了一个消息,Message的what是MESSAGE_POST_RESULT,就会进入InternalHandler的第一个分支。这里又涉及到了一个内部类AsyncTaskResult,其实就是对Result和AsyncTask对象本身的封装。
在InternalHandler的handlerMessage方法中调用了result(AsyncTaskResult)对象的mTask(AsyncTask自身)的finish方法。我们再去看finish方法:
如果任务没被取消,finish会走到else分支,调用了onPostExecute,交给主线程处理了。
整个过程分析完了,自我感觉逻辑还是挺清晰的,按照AsyncTask的运行顺序来解析的。
相关文章推荐
- Mac环境下服务器搭建
- 代码重构 —— 区分代码和数据
- php防止sql注入
- ERP流程一 总体说明
- 《foreach循环示例》
- windows下安装解压缩mysql
- #Codeforces 343 [div2] D. Babaei and Birthday Cake 【线段树优先队列查询优化】
- [置顶] 嗨~大家好,欢迎大家来这逛逛
- Python迁移MySQL数据到MongoDB脚本
- 系统启动流程
- 我有一个梦想
- [转载]Python标准库:内置函数sum(iterable[, start])
- 一条Log引发的血案
- DHCP协议原理及其实现流程
- ExpandableListView修改group图标
- windows主线程等待子线程退出卡死问题
- 数据库基础知识练习题
- 多线程还是多进程的区别
- OpenCV ARM移植(交叉编译opencv)
- 有趣的vim练习游戏