日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > linux >内容正文

linux

linux异步实现原理,Android异步处理四:AsyncTask的实现原理

發(fā)布時(shí)間:2024/7/23 linux 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 linux异步实现原理,Android异步处理四:AsyncTask的实现原理 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

分析:

在分析實(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)題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。