linux异步实现原理,Android异步处理四:AsyncTask的实现原理
分析:
在分析實(shí)現(xiàn)流程之前,我們先了解一下AsyncTask有哪些成員變量。
privatestaticfinalintCORE_POOL_SIZE?=5;//5個(gè)核心工作線程
privatestaticfinalintMAXIMUM_POOL_SIZE?=128;//最多128個(gè)工作線程
privatestaticfinalintKEEP_ALIVE?=1;//空閑線程的超時(shí)時(shí)間為1秒
privatestaticfinalBlockingQueue?sWorkQueue?=
newLinkedBlockingQueue(10);//等待隊(duì)列
privatestaticfinalThreadPoolExecutorsExecutor?=newThreadPoolExecutor(CORE_POOL_SIZE,
MAXIMUM_POOL_SIZE,?KEEP_ALIVE,?TimeUnit.SECONDS,?sWorkQueue,sThreadFactory);//線程池是靜態(tài)變量,所有的異步任務(wù)都會(huì)放到這個(gè)線程池的工作線程內(nèi)執(zhí)行。
回到例子中,點(diǎn)擊按鈕之后會(huì)新建一個(gè)GetCSDNLogoTask對(duì)象:
GetCSDNLogoTask?task?=newGetCSDNLogoTask();
此時(shí)會(huì)調(diào)用父類AsyncTask的構(gòu)造函數(shù):
AsyncTask.java
publicAsyncTask()?{
mWorker?=newWorkerRunnable()?{
publicResult?call()throwsException?{
Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND);
returndoInBackground(mParams);
}
};
mFuture?=newFutureTask(mWorker)?{
@Override
protectedvoiddone()?{
Message?message;
Result?result?=null;
try{
result?=?get();
}catch(InterruptedException?e)?{
Android.util.Log.w(LOG_TAG,?e);
}catch(ExecutionException?e)?{
thrownewRuntimeException("An?error?occured?while?executing?doInBackground()",
e.getCause());
}catch(CancellationException?e)?{
message?=?sHandler.obtainMessage(MESSAGE_POST_CANCEL,
newAsyncTaskResult(AsyncTask.this,?(Result[])null));
message.sendToTarget();//取消任務(wù),發(fā)送MESSAGE_POST_CANCEL消息
return;
}catch(Throwable?t)?{
thrownewRuntimeException("An?error?occured?while?executing?"
+"doInBackground()",?t);
}
message?=?sHandler.obtainMessage(MESSAGE_POST_RESULT,
newAsyncTaskResult(AsyncTask.this,?result));//完成任務(wù),發(fā)送MESSAGE_POST_RESULT消息并傳遞result對(duì)象
message.sendToTarget();
}
};
}
WorkerRunnable類實(shí)現(xiàn)了callable接口的call()方法,該函數(shù)會(huì)調(diào)用我們?cè)贏syncTask子類中實(shí)現(xiàn)的doInBackground(mParams)方法,由此可見,WorkerRunnable封裝了我們要執(zhí)行的異步任務(wù)。FutureTask中的protected void done() {}方法實(shí)現(xiàn)了異步任務(wù)狀態(tài)改變后的操作。當(dāng)異步任務(wù)被取消,會(huì)向UI線程傳遞MESSAGE_POST_CANCEL消息,當(dāng)任務(wù)成功執(zhí)行,會(huì)向UI線程傳遞MESSAGE_POST_RESULT消息,并把執(zhí)行結(jié)果傳遞到UI線程。
由此可知,AsyncTask在構(gòu)造的時(shí)候已經(jīng)定義好要異步執(zhí)行的方法doInBackground(mParams)和任務(wù)狀態(tài)變化后的操作(包括失敗和成功)。
當(dāng)創(chuàng)建完GetCSDNLogoTask對(duì)象后,執(zhí)行
task.execute("http://www.linuxidc.com/pic/logo.gif");
此時(shí)會(huì)調(diào)用AsyncTask的execute(Params...params)方法
AsyncTask.java
publicfinalAsyncTask?execute(Params...?params)?{
if(mStatus?!=?Status.PENDING)?{
switch(mStatus)?{
caseRUNNING:
thrownewIllegalStateException("Cannot?execute?task:"
+"?the?taskis?already?running.");
caseFINISHED:
thrownewIllegalStateException("Cannot?execute?task:"
+"?the?taskhas?already?been?executed?"
+"(a?task?canbe?executed?only?once)");
}
}
mStatus?=?Status.RUNNING;
onPreExecute();//運(yùn)行在ui線程,在提交任務(wù)到線程池之前執(zhí)行
mWorker.mParams?=?params;
sExecutor.execute(mFuture);//提交任務(wù)到線程池
returnthis;
}
當(dāng)任務(wù)正在執(zhí)行或者已經(jīng)完成,會(huì)拋出IllegalStateException,由此可知我們不能夠重復(fù)調(diào)用execute(Params...params)方法。在提交任務(wù)到線程池之前,調(diào)用了onPreExecute()方法。然后才執(zhí)行sExecutor.execute(mFuture)是任務(wù)提交到線程池。
前面我們說(shuō)到,當(dāng)任務(wù)的狀態(tài)發(fā)生改變時(shí)(1、執(zhí)行成功2、取消執(zhí)行3、進(jìn)度更新),工作線程會(huì)向UI線程的Handler傳遞消息。在《Android異步處理三:Handler+Looper+MessageQueue深入詳解》一文中我們提到,Handler要處理其他線程傳遞過(guò)來(lái)的消息。在AsyncTask中,InternalHandler是在UI線程上創(chuàng)建的,它接收來(lái)自工作線程的消息,實(shí)現(xiàn)代碼如下:
AsyncTask.java
privatestaticclassInternalHandlerextendsHandler?{
@SuppressWarnings({"unchecked","RawUseOfParameterizedType"})
@Override
publicvoidhandleMessage(Message?msg)?{
AsyncTaskResult?result?=(AsyncTaskResult)?msg.obj;
switch(msg.what)?{
caseMESSAGE_POST_RESULT:
//?There?is?onlyone?result
result.mTask.finish(result.mData[0]);//執(zhí)行任務(wù)成功
break;
caseMESSAGE_POST_PROGRESS:
result.mTask.onProgressUpdate(result.mData);//進(jìn)度更新
break;
caseMESSAGE_POST_CANCEL:
result.mTask.onCancelled();//取消任務(wù)
break;
}
}
}
當(dāng)接收到消息之后,AsyncTask會(huì)調(diào)用自身相應(yīng)的回調(diào)方法。
總結(jié):
1、 AsyncTask的本質(zhì)是一個(gè)靜態(tài)的線程池,AsyncTask派生出的子類可以實(shí)現(xiàn)不同的異步任務(wù),這些任務(wù)都是提交到靜態(tài)的線程池中執(zhí)行。
2、線程池中的工作線程執(zhí)行doInBackground(mParams)方法執(zhí)行異步任務(wù)
3、當(dāng)任務(wù)狀態(tài)改變之后,工作線程會(huì)向UI線程發(fā)送消息,AsyncTask內(nèi)部的InternalHandler響應(yīng)這些消息,并調(diào)用相關(guān)的回調(diào)函數(shù)
總結(jié)
以上是生活随笔為你收集整理的linux异步实现原理,Android异步处理四:AsyncTask的实现原理的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: mysql 查看当前数据库编码方式_My
- 下一篇: linux下c语言绘图库_Linux 下