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方法。