相信編譯器
- 大部分Crash應該都是有空指針異常導致的
- 對於大部分的簡單的空指針異常,請相信編譯器。Android studio中,對於大部分可能出現異常的情況,都會有相應的警告。
- 請儘量處理編譯器的警告
- 大部分項目,應該eclipse中開發,可以轉換爲android studio項目,或者將代碼複製到android中。
- 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,我們需要把初始化過程放在異步線程裏。這就出現了相應問題:
- 對於變量,初始化後才能賦值。
- 如果立即使用,初始化過程未結束,就可能出現crash異常
規範方法:
- 如果可以使用默認值的,請在聲明的同時設置默認值。
- 使用同步鎖。如果變量未初始化完成,等待一段時間(自定),直至初始化完成。
參考源碼:HandleThread類。
Mvp中的crash
Mvp實現了代碼和邏輯的分離,但是也會引入內存泄露問題。
爲了解決內存泄露,就需要及時置空view和presenter對象,這樣就很可能出現crash。這一現象大量存在,可以批量處理。
規範方法:
在基類接口中聲明,isViewActive方法,要求所有的presenter實現該方法,可以有效減少這類現象。
版本兼容和權限
作爲一個不斷迭代演進的系統,版本兼容無法避免。
解決方案:
- 查看官方的變更記錄和說明,提前做好規避
- 提前使用新版本編譯。查看是否有異常。
權限異常:
作爲rom的應用,很少有個這個問題。但是在demo經常遇到。敏感權限要使用動態聲明,並且做出處理。
配置錯誤和其他
這是一個低級的常見錯誤:
使用了一個Activity,但是卻沒有在配置文件中聲明。
其他建議:
- 儘量使用String.valueOf(Object o)代替toString方法
- Interger.valueOf(String str)請捕獲異常
- list和數組先判空,判斷長度
- Content對能使用Application對象的請儘量使用
- 如果對象有置空的操作,使用前必須檢查