上周在做项目过程中,发现使用了较多的Thread+Handler和AsyncTask的方式,这周抽空看了下AsyncTask
源码(扣除各种注释,源码就剩三四百行非常简短),了解了AsyncTask的整个运行机制,现在分享如下:
总体上来说AsyncTask
1、使用Executor执行Callable和FutureTask的线程方法运行异步代码,并利用FutueTask的get()方法获取Callable异步执行的返回值;
2、自定义了继承Handler的InternalHandler 来发送两种Message,一种是MESSAGE_POST_RESULT,用来通知主线程异步任务执行完毕,
另一种是MESSAGE_POST_PROGRESS 用来在异步代码执行过程中将消息发给主线程。
详细的分析,从我们代码使用AsyncTask的步骤开始说起
1、最先使用AsyncTask,我们都要new一个AsyncTask对象,在AsyncTask的构造函数中,源码进行了两项操作
1.1生成abstract class WorkerRunnable<Params, Result> implements Callable<Result> 的实例对象
1.2将mWorker作为构造函数的参数去实例化FutureTask
2、调用AsyncTask的execute方法
源码中exeute的方法执行到最后其实就是把mFuture放到Exeutor执行,执行前设置状态为RUNNING并调用onPreExecute()后
调用mWorker的call()方法。
mWorker的call方法最终实质就是调用我们复写的doInBackground(params)方法。
执行完doInBackground(params)后InternalHandler sHandler 向主线程发送消息通知异步代码执行完成
result.mTask.finish(result.mData[0])方法会执行复写onPostExecute方法并将状态设置为FINISH
3、在doInBackground方法中我们会使用publishProgress()向主线程发消息
这个方法的实质就是利用InternalHandler向主线程发送MESSAGE_POST_PROGRESS消息,InternalHandler
收到这个消息就会调用我们复写的onProgressUpdate方法。
以上就是对AsyncTask源码的分析。
AsyncTask源码可以在http://download.csdn.net/my/uploads 或者http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/4.2.2_r1/android/os/AsyncTask.java#AsyncTask 下载