crash的實踐總結

相信編譯器

  1. 大部分Crash應該都是有空指針異常導致的
  2. 對於大部分的簡單的空指針異常,請相信編譯器。Android studio中,對於大部分可能出現異常的情況,都會有相應的警告。
  3. 請儘量處理編譯器的警告
  4. 大部分項目,應該eclipse中開發,可以轉換爲android studio項目,或者將代碼複製到android中。
  5. android studio的警告,錯誤提示比eclipse好的多。

異步任務的回調異常

  • 爲了避免出現ANR,apk大量使用了異步任務,大部分爲AysncTask,handle在onPostExecute中,如果當前的Activity已經finish或者不存在時,就會出現crash。這種情況十分常見。

解決方案:

如果在onPostExecute存在刷新頁面的動作,請先判斷當前的Activity是否存在。

在onPostExecute中,最常見的操作應該是Toast和closeProcess。

對於這兩者,可以在BaseFragment和BaseActivity提供方法。該方法要先判斷Activity是否存在。

關鍵方法1:

public boolean isActivityFinish() {

return mActivity == null || mActivity.isFinishing();

}

關鍵方法2:

 public void closeProcess() {
        if (isActivityFinish()) {
            return;
        }

        if (mProgressDialog != null) {
            mProgressDialog.dismiss();
            mProgressDialog = null;
        }
    }

關鍵方法3:

 public void showToast(int rId) {
        if (isActivityFinish()) {
            return;
        }
        Toast.makeText(this, rId, Toast.LENGTH_SHORT).show();
    }

初始化放在異步線程裏

有些情況下,初始化過程比較久,爲了避免anr,我們需要把初始化過程放在異步線程裏。這就出現了相應問題:

  1. 對於變量,初始化後才能賦值。
  2. 如果立即使用,初始化過程未結束,就可能出現crash異常

規範方法:

  1. 如果可以使用默認值的,請在聲明的同時設置默認值。
  2. 使用同步鎖。如果變量未初始化完成,等待一段時間(自定),直至初始化完成。

參考源碼:HandleThread類。

Mvp中的crash

Mvp實現了代碼和邏輯的分離,但是也會引入內存泄露問題。

爲了解決內存泄露,就需要及時置空view和presenter對象,這樣就很可能出現crash。這一現象大量存在,可以批量處理。

規範方法:

 在基類接口中聲明,isViewActive方法,要求所有的presenter實現該方法,可以有效減少這類現象。

版本兼容和權限

作爲一個不斷迭代演進的系統,版本兼容無法避免。

解決方案:

  1. 查看官方的變更記錄和說明,提前做好規避
  2. 提前使用新版本編譯。查看是否有異常。

權限異常:

作爲rom的應用,很少有個這個問題。但是在demo經常遇到。敏感權限要使用動態聲明,並且做出處理。

配置錯誤和其他

這是一個低級的常見錯誤:

使用了一個Activity,但是卻沒有在配置文件中聲明。

其他建議:

  • 儘量使用String.valueOf(Object o)代替toString方法
  • Interger.valueOf(String str)請捕獲異常
  • list和數組先判空,判斷長度
  • Content對能使用Application對象的請儘量使用
  • 如果對象有置空的操作,使用前必須檢查
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章