關於非同步任務設計的幾點思考
為什麼需要非同步任務
- 手機上的CPU和記憶體等資源是有限的。
- android應用有一個主執行緒常用於介面的更新。如果所有事情(包括耗時操作,IO操作,網路操作)都在主執行緒進行,可能因為系統無法及時處理而導致介面卡頓,甚至ANR。
- 為了避免ANR,解決卡頓問題,提高應用操作流暢性,我們需要把(耗時操作,IO操作,網路操作)等耗時/耗資源的操作放到非同步的子執行緒中進行。
ANR超時時間在ActivityManagerService.java檔案中進行了定義
1.前臺broadcast超時時間為10秒,後臺broadcast超時時間為60秒
// How long we allow a receiver to run before giving up on it.
static final int BROADCAST_FG_TIMEOUT = 10*1000;
static final int BROADCAST_BG_TIMEOUT = 60*1000;
2.按鍵無響應的超時時間為5秒
// How long we wait until we timeout on key dispatching.
static final int KEY_DISPATCHING_TIMEOUT = 5*1000;
非同步任務需要具有的幾個特點
介面關聯性(Fragment/Activity) 可選
非同步任務通常是用來執行耗時操作,最後將執行結果回撥給主執行緒,進行更新介面。
假如,非同步任務回撥結果的時候,介面已經銷燬,又將會發生什麼???
應用很可能會崩潰,並丟擲以下錯誤日誌:
Java.lang.IllegalStateException Activity has been destroyed
解決辦法:
非同步任務中儲存介面(Fragment/Activity)的弱引用。在將要回撥之前,判斷介面是否已經被銷燬。如果已經被銷燬,則不進行回撥。
可取消特性 可選
假設非同步任務在執行一個耗時的迴圈操作,此時,使用者按返回鍵退出介面,非同步任務怎麼處理???
如果該非同步任務的目的也是為了更新介面,那麼介面銷燬,應該及時停止任務,並不進行回撥。
解決辦法:
建立非同步任務的時候,返回一個Cancellable的介面。
使用者通過該介面進行取消。在將要回撥之前,判斷非同步任務是否被取消。如果非同步任務已經被取消,則不進行回撥。
統一執行緒池 必選
建議統一執行緒池,所有非同步任務都扔給執行緒池執行。
不推薦直接使用Thread類。
非同步任務方案
- AsyncTask
- 自己封裝非同步任務(Runnable/Callable)
其中,AsyncTask簡單,方便,但缺少可定製性。如果條件允許,建議自己封裝非同步任務。
相關文章
- 關於同步的一點思考-下
- 最近關於工作的幾點思考
- 關於資料庫查詢業務的幾點思考資料庫
- 關於MES業務系統解耦的幾點思考解耦
- 對於同步、非同步、阻塞、非阻塞的幾點淺薄理解非同步
- 關於設計業務應答狀態碼的一點思考
- [Android] 關於 Model 層的幾點思考(一)Android
- 關於產品經理的幾點思考?
- 關於非同步方法中的巨集任務與微任務非同步
- 非同步程式設計:.NET 4.5 基於任務的非同步程式設計模型(TAP)非同步程式設計模型
- 任務設計:關於幸福的生產力
- 關於JS下大批量非同步任務按順序執行解決方案一點思考JS非同步
- 關於難點的思考
- 關於遊戲的幾點思考(2):美、好玩與爽快感遊戲
- 關於未來美顏濾鏡發展的幾點思考
- 非同步程式設計模型的思考非同步程式設計模型
- SAP MM 關於採購組設計的思考
- Spring / Spring boot 非同步任務程式設計 WebAsyncTaskSpring Boot非同步程式設計Web
- 關於 Method Swizzling 的一點思考
- 關於git flow的一點思考Git
- 關於ORACLE大型事務回滾的幾個點Oracle
- 關於非同步郵件傳送服務的思路,和 Swoole 非同步任務的一個問題非同步
- 關於點贊業務對MySQL和Redis和MongoDB的思考MySqlRedisMongoDB
- 基於Java反射的定時任務設計Java反射
- 基於Redis的任務排程設計方案Redis
- 關於LCA的幾點想法
- 近期關於快取設計的一些思考快取
- 關於社交圈子的一點思考
- 關於開發流的一點思考
- 關於黑暗力量(BlackEnergy)的一點思考
- 關於beego的定時任務Go
- 阿里玄難:面向不確定性的軟體設計幾點思考阿里
- 談談程式設計師重複造輪子的幾點思考程式設計師
- 關於關卡設計的一點積累
- 個人成長中,關於規劃設計的思考
- 關於領域驅動設計的函式程式設計思考 - Naveen Negi函式程式設計
- js的setTimeout和Promise—同步非同步和微任務巨集任務JSPromise非同步
- 同步任務與非同步任務執行順序非同步
- 關於如何看原始碼的一點思考原始碼