關於非同步任務設計的幾點思考

snowdream86發表於2016-02-15

為什麼需要非同步任務

  1. 手機上的CPU和記憶體等資源是有限的。
  2. android應用有一個主執行緒常用於介面的更新。如果所有事情(包括耗時操作,IO操作,網路操作)都在主執行緒進行,可能因為系統無法及時處理而導致介面卡頓,甚至ANR。
  3. 為了避免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類。

非同步任務方案

  1. AsyncTask
  2. 自己封裝非同步任務(Runnable/Callable)

其中,AsyncTask簡單,方便,但缺少可定製性。如果條件允許,建議自己封裝非同步任務。


相關文章