如题,本次代码在native尚未验证,只在java层进行了验证。
原理
当一个线程由于未捕获异常即将终止时,Java虚拟机将使用Thread的getuncaughtexceptionhandler()方法查询线程的uncaughtException处理程序,并调用处理程序的uncaughtException方法,将线程和异常作为参数传递。一个线程如果没有设置uncaughtExceptionHandler,将使用线程所在的线程组来处理这个未捕获异常。线程组ThreadGroup实现了UncaughtExceptionHandler,所以可以用来处理未捕获异常。
实现
定义一个类,继承Thread.UncaughtExceptionHandler,并且重写里面的uncaughtException方法,代码如下图:
public class MyCatchException implements Thread.UncaughtExceptionHandler {
/**
* MyCatchException实例
*/
private static MyCatchException instance;
/**
* 获取MyCatchException实例 ,单例模式
*/
public static MyCatchException getInstance() {
if (instance == null) {
instance = new MyCatchException();
}
return instance;
}
/**
* 异常捕获
*/
@Override
public void uncaughtException(Thread t, Throwable e) {
System.out.println("全局异常捕获--start---");
try {
//todo 异常时相关操作
Thread.sleep(2000);
} catch (Exception e1) {
System.out.println("清空用户信息异常: " + e1.getMessage());
}
android.os.Process.killProcess(android.os.Process.myPid());
System.out.println("全局异常捕获--end---");
}
}
再在项目中的application里面定义,具体实现如下图:
/**
* bugly init
*/
private void initBugly() {
//设置全部异常捕获
try {
MyCatchException handler = MyCatchException.getInstance();
Thread.setDefaultUncaughtExceptionHandler(handler);
LogUtil.d("init----设置全局自定义异常捕获成功");
} catch (Exception e) {
LogUtil.d("init----设置全局自定义异常捕获错误: " + e.getMessage());
}
}
对于自定义全局异常和bugly同时使用的问题,请看我上一篇文章
bugly与自定义全局异常捕获
that's all----------------------------------------------------------------