基于android10.0.0源碼分析
源碼地址(最近墻不出去,貼其他源碼地址)
先來(lái)個(gè)源碼的例子

源碼分析先從AysncTask.execute()入口
step1、

step2、

藍(lán)框1部分:如果當(dāng)前AysncTask正在運(yùn)行或者已經(jīng)完成,AysncTask將不能重復(fù)執(zhí)行
藍(lán)框2部分:回調(diào)onPreExecute(); 即前面demo部分
藍(lán)框3部分:params參數(shù)最終傳遞給

藍(lán)框4部分:exec.execute(mFuture),exec是指?sDefaultExecutor,而sDefaultExecutor實(shí)現(xiàn)了Executor

mTasks.offer(new Runnable() {......}});
是將FutureTask壓入ArrayDeque,然后在schedualNext出棧。THREAD_POOL_EXECUTOR.execute(mActive);我們看下THREAD_POOL_EXECUTOR是什么東西?

其實(shí)就是通過線程池來(lái)跑FetureTask,那么這個(gè)FetrueTask又是干什么呢?
我們來(lái)看看初始化代碼

這里先走mWork的call,在call里面調(diào)用了result = doInBackground(mParams);然后通過調(diào)用PostResult
發(fā)送異步消息
private Result postResult(Result result) {
@SuppressWarnings("unchecked")
Message message = getHandler().obtainMessage(MESSAGE_POST_RESULT,
? ? ? ? ? ? new AsyncTaskResult(this, result));
? ? message.sendToTarget();
? ? return result;
}
接收異步消息的代碼:

mTask.finish的實(shí)現(xiàn)代碼如下:

上面的代碼分析分析了AysnTask的過程,實(shí)質(zhì)就是線程池+handler異步消息