crash的实践总结

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/a990924291/article/details/84781078

相信编译器

  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。这一现象大量存在,可以批量处理。

扫描二维码关注公众号,回复: 4353379 查看本文章

规范方法:

 在基类接口中声明,isViewActive方法,要求所有的presenter实现该方法,可以有效减少这类现象。

版本兼容和权限

作为一个不断迭代演进的系统,版本兼容无法避免。

解决方案:

  1. 查看官方的变更记录和说明,提前做好规避
  2. 提前使用新版本编译。查看是否有异常。

权限异常:

作为rom的应用,很少有个这个问题。但是在demo经常遇到。敏感权限要使用动态声明,并且做出处理。

配置错误和其他

这是一个低级的常见错误:

使用了一个Activity,但是却没有在配置文件中声明。

其他建议:

  • 尽量使用String.valueOf(Object o)代替toString方法
  • Interger.valueOf(String str)请捕获异常
  • list和数组先判空,判断长度
  • Content对能使用Application对象的请尽量使用
  • 如果对象有置空的操作,使用前必须检查

猜你喜欢

转载自blog.csdn.net/a990924291/article/details/84781078
今日推荐