AsyncTask 源碼解析

android 1.6之前的版本版本AsyncTask都是串行,也就是它會(huì)把所有的任務(wù)都一串一串的放在線程池中,有序的進(jìn)行執(zhí)行,而在1.6和2.3版本的時(shí)候,它改成了并行,但是在2.3版本以后為了維護(hù)系統(tǒng)的穩(wěn)定,google又把它改成了串行,但是它還是可以執(zhí)行并行,執(zhí)行并行的時(shí)候可以調(diào)用executeOnExecutor()這個(gè)方法就可以并行,一般建議只使用串行,這樣能保證整個(gè)線程池的穩(wěn)定,因?yàn)槿绻l(fā)的話,整個(gè)線程池內(nèi)部其實(shí)是不穩(wěn)定的,雖然它效率很高,但是AsyncTask一般做不了高并發(fā),太耗時(shí)的操作。

AsncTask框架的整體結(jié)構(gòu)。

AsynTask的五個(gè)方法
onPreExecute() //后臺(tái)執(zhí)行開始前調(diào)用
doInBackground() //執(zhí)行耗時(shí)代碼
pushlishProgress() //在doInBackground中調(diào)用,為觸發(fā)onProgressUpdate
onProgressUpdate()
onPostExecute() //后臺(tái)執(zhí)行完成時(shí)調(diào)用
OnDestroy()生命周期方法里面進(jìn)行syncTask的cancel()方法調(diào)用。

AsyncTask的機(jī)制原理
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ù)。

注意:
在屏幕旋轉(zhuǎn),或activity由于后臺(tái)系統(tǒng)殺掉,就是內(nèi)存不夠的情況下被殺掉,會(huì)導(dǎo)致activity被重新創(chuàng)建,之前運(yùn)行的AsyncTask會(huì)持有當(dāng)前Activity的引用,但是這個(gè)引用已經(jīng)無效了,所以說這時(shí)調(diào)用AsyncTask的onPostExecute()去更新界面,就是不會(huì)在生效,這就是asyncTask結(jié)果丟失的原因。
解決方法:
OnDestroy()生命周期方法里面進(jìn)行syncTask的cancel()方法調(diào)用。

當(dāng)Activity被銷毀時(shí),其實(shí)AsyncTask還在后臺(tái)執(zhí)行,所以又與handler一樣存在內(nèi)存泄漏問題,解決方法同handler類似

參考:http://blog.csdn.net/lmj623565791/article/details/38614699

?著作權(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)容