基于Android API 29
一個輕量級異步操作類,此文只介紹內(nèi)部的執(zhí)行流程,對于優(yōu)缺點和一些細(xì)節(jié)上的問題后期會更新~
AsyncTask的使用和主要方法:

AsyncTask構(gòu)造函數(shù):

初始化了mHandler,mFuture,mWorker 三個實例,WorkerRunnable是Callable接口的一個實現(xiàn)類,實現(xiàn)了Callable的call方法,F(xiàn)utureTask是間接實現(xiàn)的Runnable, Future接口的類,
初始化FutureTask時傳入了mWorker ,F(xiàn)utureTask本身是一個Runnable的實現(xiàn)類,下面的線程池執(zhí)行的就是FutureTask,類里面實現(xiàn)了run()方法,run()方法里面通過調(diào)用mWorker 的call()回調(diào)方法拿到結(jié)果后,調(diào)用done()回調(diào),并將mWorker 置為null,觸發(fā)上面的postResultIfNotInvoked(get())方法。
調(diào)用new?AsyncTask().execute();后會觸發(fā)哪些邏輯?

Status是個枚舉有三種狀態(tài):PENDING:待定? ? ?RUNNING:運行中? ? ?FINISHED:已完成,用 mStatus 標(biāo)記當(dāng)前的狀態(tài)。
onPreExecute();在exec.execute(mFuture);之前執(zhí)行,exec是sDefaultExecutor的形參,實現(xiàn)了Executor接口的execute的方法,內(nèi)部有一個ArrayDeque雙端隊列,mActive是一個Runnable用于標(biāo)識當(dāng)前正在執(zhí)行的任務(wù)。
代碼如下:

當(dāng)執(zhí)行exec.execute(mFuture)方法時會把傳進(jìn)來的mFuture任務(wù)包裝成一個新的Runnable 添加到ArrayDeque隊列中,并且判斷當(dāng)前是否有任務(wù)正在執(zhí)行,mActive == null時會通過ArrayDeque的poll()方法獲取隊列中的第一個任務(wù)(獲取的任務(wù)不為空)且從對列中刪除這個任務(wù),然后把這個任務(wù)交給THREAD_POOL_EXECUTOR來執(zhí)行。

THREAD_POOL_EXECUTOR線程池,核心線程數(shù)1個,最大線程數(shù)20,線程空閑時常3秒;
執(zhí)行流程:
1. 通過sDefaultExecutor的.execute(mFuture)方法把?mFuture添加到sDefaultExecutor內(nèi)部的ArrayDeque雙端隊列里面,mFuture是Runnable的實現(xiàn)類。
2.? 添加隊列里面后會判斷當(dāng)前沒有任務(wù)在執(zhí)行,沒有則獲取隊列的第一個任務(wù),并從隊列中刪除該任務(wù),交給THREAD_POOL_EXECUTOR線程池來執(zhí)行。
3.? 執(zhí)行時是通過FutureTask內(nèi)部的run()調(diào)用了mWorker 的call()回調(diào),并返回結(jié)果,然后調(diào)用FutureTask的回調(diào)方法done();