android 1.6之前的版本版本AsyncTask都是串行丧荐,也就是它會把所有的任務(wù)都一串一串的放在線程池中辱魁,有序的進行執(zhí)行,而在1.6和2.3版本的時候畴蒲,它改成了并行悠鞍,但是在2.3版本以后為了維護系統(tǒng)的穩(wěn)定,google又把它改成了串行饿凛,但是它還是可以執(zhí)行并行狞玛,執(zhí)行并行的時候可以調(diào)用executeOnExecutor()這個方法就可以并行软驰,一般建議只使用串行涧窒,這樣能保證整個線程池的穩(wěn)定,因為如果并發(fā)的話锭亏,整個線程池內(nèi)部其實是不穩(wěn)定的纠吴,雖然它效率很高,但是AsyncTask一般做不了高并發(fā)慧瘤,太耗時的操作戴已。
AsncTask框架的整體結(jié)構(gòu)。
AsynTask的五個方法
onPreExecute() //后臺執(zhí)行開始前調(diào)用
doInBackground() //執(zhí)行耗時代碼
pushlishProgress() //在doInBackground中調(diào)用锅减,為觸發(fā)onProgressUpdate
onProgressUpdate()
onPostExecute() //后臺執(zhí)行完成時調(diào)用
OnDestroy()生命周期方法里面進行syncTask的cancel()方法調(diào)用糖儡。
AsyncTask的機制原理
1.AsyncTask的本質(zhì)是一個靜態(tài)的線程池,AsyncTask派生出的子類可以實現(xiàn)不同的異步任務(wù)怔匣,這些任務(wù)都是提交到靜態(tài)的線程池中執(zhí)行握联。
2.線程池中的工作線程執(zhí)行doInBackground(mParams)方法執(zhí)行異步任務(wù)
3.當(dāng)任務(wù)狀態(tài)改變之后,工作線程會向UI線程發(fā)送消息每瞒,AsyncTask內(nèi)部的InternalHandler相應(yīng)這些消息,并調(diào)用相關(guān)的回調(diào)函數(shù)金闽。
注意:
在屏幕旋轉(zhuǎn),或activity由于后臺系統(tǒng)殺掉剿骨,就是內(nèi)存不夠的情況下被殺掉代芜,會導(dǎo)致activity被重新創(chuàng)建,之前運行的AsyncTask會持有當(dāng)前Activity的引用浓利,但是這個引用已經(jīng)無效了挤庇,所以說這時調(diào)用AsyncTask的onPostExecute()去更新界面钞速,就是不會在生效,這就是asyncTask結(jié)果丟失的原因罚随。
解決方法:
OnDestroy()生命周期方法里面進行syncTask的cancel()方法調(diào)用玉工。
當(dāng)Activity被銷毀時,其實AsyncTask還在后臺執(zhí)行淘菩,所以又與handler一樣存在內(nèi)存泄漏問題遵班,解決方法同handler類似
參考:http://blog.csdn.net/lmj623565791/article/details/38614699