Android 全局捕获异常信息


都遇到过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。


渣渣一枚,以上如有错误,请各位大神指正(抱拳)。

你可能感兴趣的:(Android 全局捕获异常信息)