AsyncTask源码分析
来源:互联网 发布:淘宝达人申请大v认证 编辑:程序博客网 时间:2024/05/21 17:14
前置内容: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复写了done方法,done方法是任务执行完毕后的回调。get方法是获得FutureTask的运行结果。done方法中调用postResultIfNotInvoked(get())就是将Future的运行结果作为参数调用postResultIfNotInvoked方法。
这样doInBackground执行的结果就会在done方法的回调中作为参数传给postResultIfNotInvoked方法。
postResultIfNotInvoked调用了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方法:
- AsyncTask 源码分析
- AsyncTask源码分析
- Android AsyncTask源码分析
- Android源码分析--AsyncTask
- 源码分析Android AsyncTask
- Android AsyncTask源码分析
- AsyncTask源码分析
- Android-AsyncTask源码分析
- 源码分析--AsyncTask
- AsyncTask源码分析
- AsyncTask源码分析
- AsyncTask源码分析
- AsyncTask源码分析
- Android AsyncTask 源码分析
- AsyncTask源码分析
- AsyncTask源码分析
- AsyncTask源码分析
- AsyncTask源码分析
- 常见的iOS对动画的操作
- 快速认识和使用浏览器跟踪Http服务及Http服务调试工具
- Swift-简单值
- 实现大数字加减。
- Android百度地图深入学习(2)
- AsyncTask源码分析
- oracle导入dmp文件命令、sql文件命令, Oracle用户的新增、修改、删除及授权
- Android——消息机制
- 微软的基于webgl的H5 3D游戏引擎
- Windows下CURL扩展无效之终极解决办法。
- Tomcat 内存溢出,堆栈配置各种调整
- codeforce 165C Another Problem on Strings
- 机器学习中怎样的特征才是好特征
- Hadoop之MapReduce改进的计数单词(八)