AsyncTask

AsyncTask是一個(gè)異步任務(wù)類,它的內(nèi)部封裝了Hanlder和線程池,當(dāng)使用無參數(shù)的構(gòu)造方法時(shí),Handler使用InternalHandler,運(yùn)行在主線程??梢允褂脴?gòu)造方法,public AsyncTask(@Nullable Looper callbackLooper) 讓Handler運(yùn)行在子線程。AsyncTask為 UI 線程與工作線程之間進(jìn)行快速的切換提供一種簡單便捷的機(jī)制。適用于當(dāng)下立即需要啟動(dòng),但是異步執(zhí)行的生命周期短暫的使用場景。

異步任務(wù)由3種泛型定義,Params(參數(shù)),Progress(進(jìn)度),Result(結(jié)果)。

包含四個(gè)步驟,onPreExecute(任務(wù)執(zhí)行前調(diào)用),doInBackground(執(zhí)行后臺任務(wù)),onProgressUpdate(更新進(jìn)度),onPostExecute(任務(wù)執(zhí)行完之后調(diào)用,運(yùn)行在UI線程)。


調(diào)用execute方法可以開啟一個(gè)任務(wù)。

public final AsyncTask execute(Params... params) {

return executeOnExecutor(sDefaultExecutor, params);

}


在executeOnExecutor方法里,首先調(diào)用onPreExecute方法,然后將參數(shù)賦值給mWorker(WorkerRunnable實(shí)現(xiàn)類).

mWorker.mParams = params;

調(diào)用SerialExecutor的execute(mFuture)方法,開始執(zhí)行后臺任務(wù)。

private static class SerialExecutorimplements Executor {

final ArrayDequemTasks =new ArrayDeque();

RunnablemActive;

public synchronized void execute(final Runnable r) {

mTasks.offer(new Runnable() {

public void run() {

try {

r.run();//執(zhí)行FutureTask的run方法。run方法中執(zhí)行Callable的call方法。

}finally {

scheduleNext();線性調(diào)度執(zhí)行,本次任務(wù)完成之后,再執(zhí)行下一個(gè)任務(wù)。

}

}

});

if (mActive ==null) {

scheduleNext();

}

}

protected synchronized void scheduleNext() {

if ((mActive =mTasks.poll()) !=null) {

THREAD_POOL_EXECUTOR.execute(mActive);

}

}

}

AsyncTask構(gòu)造方法里,初始化了WorkerRunnable,WorkerRunnable實(shí)現(xiàn)了Callable接口,在call()方法中doInBackground()方法,執(zhí)行后臺操作,執(zhí)行完之后,調(diào)用postResult方法,這個(gè)方法通過Handler發(fā)送消息,將線程切換到UI線程。在AsyncTask的finish方法里調(diào)用onPostExecute方法。

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

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

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