android源碼分析 - AysncTask

基于android10.0.0源碼分析

源碼地址(最近墻不出去,貼其他源碼地址)

https://www.androidos.net.cn/android/10.0.0_r6/xref/frameworks/base/core/java/android/os/AsyncTask.java

先來(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異步消息

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容