版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/a990924291/article/details/84781078
相信编译器
- 大部分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。这一现象大量存在,可以批量处理。
扫描二维码关注公众号,回复:
4353379 查看本文章
规范方法:
在基类接口中声明,isViewActive方法,要求所有的presenter实现该方法,可以有效减少这类现象。
版本兼容和权限
作为一个不断迭代演进的系统,版本兼容无法避免。
解决方案:
- 查看官方的变更记录和说明,提前做好规避
- 提前使用新版本编译。查看是否有异常。
权限异常:
作为rom的应用,很少有个这个问题。但是在demo经常遇到。敏感权限要使用动态声明,并且做出处理。
配置错误和其他
这是一个低级的常见错误:
使用了一个Activity,但是却没有在配置文件中声明。
其他建议:
- 尽量使用String.valueOf(Object o)代替toString方法
- Interger.valueOf(String str)请捕获异常
- list和数组先判空,判断长度
- Content对能使用Application对象的请尽量使用
- 如果对象有置空的操作,使用前必须检查