一切從task.execute(url);開始
560行params就是我們傳入的參數(shù)(url或者其他耗時(shí)操作所需要的參數(shù)) 另一個(gè)參數(shù)sDefaultExecutor就是一個(gè)SerialExecutor,如下圖:
先看下SerialExecutor是什么
綜合上面可以看出當(dāng)sDefaultExecutor的execute(Runnable r)方法執(zhí)行時(shí)會(huì)調(diào)用SerialExecutor的execute(final Runnable r)方法
同時(shí)在execute方法中新建了一個(gè)子線程并在這個(gè)子線程中調(diào)用了傳入的Runnable的run()方法雄卷,簡(jiǎn)單來說就是后面調(diào)用sDefaultExecutor的execute(Runnable r)方法時(shí)就會(huì)開啟一個(gè)子線程在子線程中調(diào)用傳入的Runnable的run方法,這是異步的核心
回到上面executeOnExecutor(sDefaultExecutor, params);方法
首先是狀態(tài)判斷蛤售,然后發(fā)現(xiàn)在子線程之前調(diào)用的onPreExecute();是在這里執(zhí)行的? 現(xiàn)在知道了onPreExecute()的調(diào)用時(shí)機(jī)
接著往下看mWorker.mParams= params;將AsyncTask執(zhí)行時(shí)傳入的Params... params賦值個(gè)了mWorker的成員變量
然后調(diào)用了exec.execute(mFuture);即sDefaultExecutor的execute(Runnable r)被調(diào)用了丁鹉,所以mFuture是一個(gè)Runnable并且在子線程中執(zhí)行了mFuture的run方法
再來看看mWorker、mFuture到底是什么悴能,
從上面可以看出當(dāng)實(shí)例化AsyncTask是這兩個(gè)對(duì)象也被創(chuàng)建了揣钦,同時(shí)mFuture創(chuàng)建時(shí)把mWorker通過構(gòu)造傳入了
前面說過mFuture是一個(gè)Runnable 我們先來看看是否是這樣
mFuture實(shí)現(xiàn)了RunnableFuture接口,而RunnableFuture接口繼承了Runnable接口漠酿,故可以認(rèn)為mFuture就是一個(gè)Runnable
所以再來看看mFuture的run方法
237行調(diào)用的c.call()方法 由232得知c就是callable ?再來看看callable
由上面構(gòu)造得知callable就是創(chuàng)建FutureTask對(duì)象時(shí)傳入的mWorker對(duì)象冯凹,所以最終mWorker的call()方法會(huì)被調(diào)用
doInBackground(mParams);方法就被執(zhí)行了,此處是在子線程中執(zhí)行的
在往后面看postResult(result)
通過hander發(fā)送了一條消息 傳遞了一個(gè)AsyncTaskResult對(duì)象
再來看看處理這個(gè)消息的handler
result.mTask.finish(result.mData[0]);調(diào)用了result.mTask的finish方法 即AsyncTask的finish方法
onPostExecute(result)炒嘲、onCancelled(result)調(diào)用 在主線程中
再來看看AsyncTask的線程處理
236行創(chuàng)建了一個(gè)ArrayDeque宇姚,顧名思義這是一個(gè)雙向隊(duì)列,然后將執(zhí)行異步任務(wù)的Runnable放入這個(gè)隊(duì)列夫凸,然后從這個(gè)隊(duì)列中取Runnable 通過線程池執(zhí)行這個(gè)Runnable
下面是使用AsyncTask下載多張圖片時(shí)線程池的狀態(tài)