一切從task.execute(url);開始

560行params就是我們傳入的參數(shù)(url或者其他耗時操作所需要的參數(shù)) 另一個參數(shù)sDefaultExecutor就是一個SerialExecutor,如下圖:

先看下SerialExecutor是什么

綜合上面可以看出當(dāng)sDefaultExecutor的execute(Runnable r)方法執(zhí)行時會調(diào)用SerialExecutor的execute(final Runnable r)方法
同時在execute方法中新建了一個子線程并在這個子線程中調(diào)用了傳入的Runnable的run()方法,簡單來說就是后面調(diào)用sDefaultExecutor的execute(Runnable r)方法時就會開啟一個子線程在子線程中調(diào)用傳入的Runnable的run方法,這是異步的核心
回到上面executeOnExecutor(sDefaultExecutor, params);方法

首先是狀態(tài)判斷,然后發(fā)現(xiàn)在子線程之前調(diào)用的onPreExecute();是在這里執(zhí)行的? 現(xiàn)在知道了onPreExecute()的調(diào)用時機(jī)
接著往下看mWorker.mParams= params;將AsyncTask執(zhí)行時傳入的Params... params賦值個了mWorker的成員變量
然后調(diào)用了exec.execute(mFuture);即sDefaultExecutor的execute(Runnable r)被調(diào)用了,所以mFuture是一個Runnable并且在子線程中執(zhí)行了mFuture的run方法
再來看看mWorker、mFuture到底是什么,

從上面可以看出當(dāng)實例化AsyncTask是這兩個對象也被創(chuàng)建了,同時mFuture創(chuàng)建時把mWorker通過構(gòu)造傳入了
前面說過mFuture是一個Runnable 我們先來看看是否是這樣

mFuture實現(xiàn)了RunnableFuture接口,而RunnableFuture接口繼承了Runnable接口,故可以認(rèn)為mFuture就是一個Runnable
所以再來看看mFuture的run方法

237行調(diào)用的c.call()方法 由232得知c就是callable ?再來看看callable

由上面構(gòu)造得知callable就是創(chuàng)建FutureTask對象時傳入的mWorker對象,所以最終mWorker的call()方法會被調(diào)用

doInBackground(mParams);方法就被執(zhí)行了,此處是在子線程中執(zhí)行的
在往后面看postResult(result)

通過hander發(fā)送了一條消息 傳遞了一個AsyncTaskResult對象

再來看看處理這個消息的handler

result.mTask.finish(result.mData[0]);調(diào)用了result.mTask的finish方法 即AsyncTask的finish方法

onPostExecute(result)、onCancelled(result)調(diào)用 在主線程中
再來看看AsyncTask的線程處理

236行創(chuàng)建了一個ArrayDeque,顧名思義這是一個雙向隊列,然后將執(zhí)行異步任務(wù)的Runnable放入這個隊列,然后從這個隊列中取Runnable 通過線程池執(zhí)行這個Runnable
下面是使用AsyncTask下載多張圖片時線程池的狀態(tài)
