都遇到过APP使用崩溃的情况,尤其是在线上的崩溃,我们无法看到崩溃信息,此时就需要对崩溃信息进行收集。之前用的都是第三方的来进行,最近项目中需要自己来实现此功能。
其实Google已经为我们提供了全局捕获异常机制:UncaughtExceptionHandler。
UncaughtExceptionHandler 是Thread类中定义的一个接口,Android中程默认实现了该接口来处理异常信息并退出。
自定义捕获异常
如果我们需要自己捕获并处理异常信息,思路就是 UncaughtExceptionHandler 接口,并将其加入到对应的Thread中,示例代码如下:
//获取系统默认的处理类实例
Thread.UncaughtExceptionHandler oldHandler = Thread.getDefaultUncaughtExceptionHandler();
//定义自己的错误信息处理类
Thread.UncaughtExceptionHandler handler = new Thread.UncaughtExceptionHandler() {
@Override
public void uncaughtException(Thread t, Throwable e) {
//当有异常信息时,需要在这里进行处理,
if (oldHandler != null) {
oldHandler.uncaughtException(t,e);// 1
}
}
};
//设置为默认的处理信息
Thread.setDefaultUncaughtExceptionHandler(handler);
通过以上代码便可获取到全局的异常信息,可在uncaughtException方法中对错误信息进行保存等操作。
错误处理
- 当把错误信息保存或发送到服务端后,还需对错误进行处理,如代码 1 处(以上代码只是示例代码,可根据自己的逻辑来对错误进行处理)。如果不对错误进行处理,程序将会无反应,造成ANR。是因为当程序报错时,UI线程中的looper将不在进行消息轮询,所以会造成程序ANR(附:我在测试时,等报错将错误捕捉后试着调用了looper的loop静态方法来重新开启轮询,程序是没有崩溃并可以正常运行的,但程序此时再次报错时,程序就会卡死ANR,不知道是为什么,还望路过的大神们指点)。
建议:一般在项目中报错后会弹出错误提示并退出,退出时可以调用Application的onTerminate方法来实现程序关闭。这样程序再次启动时也不会有任何问题。当然也可以关闭后重新打开APP。
渣渣一枚,以上如有错误,请各位大神指正(抱拳)。
网友评论