crash的实践总结

2017-10-30  本文已影响0人  天天听听

相信编译器

1、大部分Crash应该都是有空指针异常导致的

2、对于大部分的简单的空指针异常,请相信编译器。Android studio中,对于大部分可能出现异常的情况,都会有相应的警告。

3、请尽量处理编译器的警告

4、大部分项目,应该eclipse中开发,可以转换为android studio项目,或者将代码复制到android中。

5、android studio的警告,错误提示比eclipse好的多。

异步任务的回调异常

1、为了避免出现ANR,apk大量使用了异步任务,大部分为AysncTask,handle

2、在onPostExecute中,如果当前的Activity已经finish或者不存在时,就会出现crash。这种情况十分常见。

解决方案:

1、如果在onPostExecute存在刷新页面的动作,请先判断当前的Activity是否存在。

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

规范方法:

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

版本兼容和权限

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

解决方案:

1、查看官方的变更记录和说明,提前做好规避

2、提前使用新版本编译。查看是否有异常。

权限异常:

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

配置错误和其他

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

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

其他建议:

尽量使用String.valueOf(Object o)代替toString方法

Interger.valueOf(String str)请捕获异常

list和数组先判空,判断长度

Content对能使用Application对象的请尽量使用

如果对象有置空的操作,使用前必须检查

上一篇 下一篇

猜你喜欢

热点阅读