目錄
- 什么是AsyncTask
- 使用方式
- 實現(xiàn)原理
- 注意事項
4.1 內(nèi)存泄漏
4.2 生命周期
4.3 結果丟失
4.4 并行or串行
1. 什么是AsyncTask
異步框架联予,封裝了Handler和線程池
2. 使用方式
AsyncTask是一個抽象類楣黍,需要被繼承并重寫 doInBackground() 方法,然后 execute() 啟動
三個參數(shù):
- Params:輸入的參數(shù)
- Progress:中間結果(進度)
- Result:最終返回值
四個方法:
- onPreExecute()
- doInBackground(Params...)
- onProgressUpdate(Progress...)
- onPostExecute(Result)
除了 doInBackground() 運行在工作線程,其余均運行在主線程哮笆。doInBackground() 中能通過調用 publishProgress() 將進度傳到 onProgressUpdate() 中菇曲,它運行完后,自動將結果返回到 onPostExecute() 方法
3. 實現(xiàn)原理
- execute() 中調用線程池 sDefaultExecutor 去執(zhí)行 doInBackground()
- 工作線程任務結束后向 AsyncTask 內(nèi)部的
InternalHandler 發(fā)送消息码党,回調 onPostExecute() 方法
4. 注意事項
4.1 內(nèi)存泄漏
- 非靜態(tài)內(nèi)部類持有外部類引用
- 當 AsyncTask 被聲明為內(nèi)部類德崭,且正在執(zhí)行后臺任務時銷毀 Activity 會導致泄漏
- 解決方法可以將 AsyncTask 設為靜態(tài)內(nèi)部類
4.2 生命周期
- AsyncTask 不會隨著 Activity 的銷毀而銷毀,沒有主動調用 cancel() 它是不會被銷毀的
- 必須在 Activity 的 onDestroy() 中調用 AsyncTask.cancel()揖盘,否則它處理的 View 會因找不到依托的 Activity 而崩潰
4.3 結果丟失
- 當屏幕旋轉或 Activity 因內(nèi)存不足而被銷毀重建時眉厨,AsyncTask 會持有之前的 Activity,但是 Activity 已經(jīng)無效了兽狭,此時調用 onPostExecute() 更新界面是不會再生效的
4.4 并行or串行
- Android 1.6 前串行憾股,1.6 ~ 2.3 并行,2.3 后又改成串行但仍能執(zhí)行并行(只需調用 executeOnExecutor() 方法)
- 最好是使用串行箕慧,能保證系統(tǒng)穩(wěn)定性(execute() 是串行服球,因為使用的線程池是 SerialExecutor)