AsyncTask 源碼解析

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

AsncTask框架的整體結構。

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

AsyncTask的機制原理
1.AsyncTask的本質是一個靜態(tài)的線程池,AsyncTask派生出的子類可以實現不同的異步任務,這些任務都是提交到靜態(tài)的線程池中執(zhí)行。
2.線程池中的工作線程執(zhí)行doInBackground(mParams)方法執(zhí)行異步任務
3.當任務狀態(tài)改變之后,工作線程會向UI線程發(fā)送消息,AsyncTask內部的InternalHandler相應這些消息,并調用相關的回調函數。

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

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

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

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容