基于android10.0.0源码分析
源码地址(最近墙不出去,贴其他源码地址)
先来个源码的例子

源码分析先从AysncTask.execute()入口
step1、

step2、

蓝框1部分:如果当前AysncTask正在运行或者已经完成,AysncTask将不能重复执行
蓝框2部分:回调onPreExecute(); 即前面demo部分
蓝框3部分:params参数最终传递给

蓝框4部分:exec.execute(mFuture),exec是指 sDefaultExecutor,而sDefaultExecutor实现了Executor

mTasks.offer(new Runnable() {......}});
是将FutureTask压入ArrayDeque,然后在schedualNext出栈。THREAD_POOL_EXECUTOR.execute(mActive);我们看下THREAD_POOL_EXECUTOR是什么东西?

其实就是通过线程池来跑FetureTask,那么这个FetrueTask又是干什么呢?
我们来看看初始化代码

这里先走mWork的call,在call里面调用了result = doInBackground(mParams);然后通过调用PostResult
发送异步消息
private Result postResult(Result result) {
@SuppressWarnings("unchecked")
Message message = getHandler().obtainMessage(MESSAGE_POST_RESULT,
new AsyncTaskResult(this, result));
message.sendToTarget();
return result;
}
接收异步消息的代码:

mTask.finish的实现代码如下:

上面的代码分析分析了AysnTask的过程,实质就是线程池+handler异步消息
网友评论