AsyncTask 源码分析
参考:https://blog.csdn.net/iispring/article/details/50670388
AsyncTask 使用流程
图源:https://blog.csdn.net/carson_ho/article/details/79314326
开始准备工作
execute()
1 |
|
execute()只能在主线程执行
调用executeOnExecutor方法,将sDefaultExecutor当作参数传入方法,这个是默认的执行的Executer
看一下sDefaultExecutor是个什么东西
1 | //sDefaultExecutor初始值是SerialExecutor的实例化 |
SerialExecutor的用处
将执行任务进行进一步的封装,真正处理这个任务的是THREAD_POOL_EXECUTOR
将新任务放进一个队列中,保证每次处理的都是按顺序的,也就是所谓的串行处理
用THREAD_POOL_EXECUTOR线程池来进行任务的调度。
execteOnExecutor
1 |
|
将所有的处理任务所需要的信息,和对结果的控制放在mFuture里面,由线程池来调度任务的执行
- onPreExecute();
1 | //在真正开始执行之前先进行onPreExecute,重写此方法* |
- mWorker 是一个WorkerRunnable的对象
1 | //指定泛型result的Callable* |
实际任务的处理
AsynaTask的构造函数,将mWorker和mFuture实例化
1 | *//AsyncTask的构造函数需要在ui线程调用* |
<!–6–>
任务执行过程中和结束时的消息处理
利用postResult将result中的信息发送给InternalHandler来处理
1 | private void postResultIfNotInvoked(Result result) { |
1 | private Result postResult(Result result) { |
只是将result和task的实例进行封装,没有实例方法
1 | private static class AsyncTaskResult<Data> { |
InternalHandler是一个继承了Handler的内部类,重写了handleMessage方法
msg有两种
MESSAGE_POST_RESULT: 表示任务已经完成,调用finish方法来处理结果
MESSAGE_POST_PROGRESS: 表示阶段性完成,publishProgress()发送的msg,调用onProgressUpdate来显示进度条等操作
1 | private static class InternalHandler extends Handler { |
根据状态来处理,已取消或者已完成来分别处理
1 | private void finish(Result result) { |
总结
AsyncTask的执行流程:
在主线程(可以不是主线程)调用execute()方法,传入
param参数,以SerialExecutor的实例化对象sDefaultExecutor为参数调用executeOnExecutor(Executor exec, Params… params)来处理paramsSerialExecutor是继承executor一个内部类,内部维护了一个任务队列,保证事务的串行执行,实际是在线程池THREAD_POOL_EXECUTOR的execte方法来处理的,处理的就是FutureTask的对象将doInBackground方法封装在mWorker的call()方法中,再把mWorker当参数实例化一个FutureTask的实例,由FutureTask来处理doInBackground中的异常
mFuture在执行过程中发生异常时,是通过调用postResultIfNotInvoked方法调用postResult()
执行成功时直接调用postResult来finish(),finish()再调用重写的onPostExecute()来处理结果