当一个app在运行时,难免会发生一些不可预知的BUG,这时,如果不知道它因为什么错误导致的,那修复就比较困难了,所以,我们可以采用一个全局异常捕获类来把这些不可预知的BUG给捕获下来,然后写在我们的日志里或者上传到服务器,而这个全局异常捕获类怎么实现呢,通过实现UncaughtExceptionHandler接口来创建。
当某一线程发生未捕获的异常而即将终止时,java虚拟机会调用 Thread.getUncaughtExceptionHandler() 方法获取UncaughtExceptionHandler实例来处理异常,会在uncaughtException方法里处理,而我们如果实现UncaughtExceptionHandler接口,那就需要重写并在uncaughtException方法里做我们想做的事,当线程发生未捕获的异常时,java虚拟机调用 Thread.getUncaughtExceptionHandler() 方法就返回我们的实例了。
当某一线程发生未捕获的异常而即将终止时,java虚拟机会调用 Thread.getUncaughtExceptionHandler() 方法获取UncaughtExceptionHandler实例来处理异常,会在uncaughtException方法里处理,而我们如果实现UncaughtExceptionHandler接口,那就需要重写并在uncaughtException方法里做我们想做的事,当线程发生未捕获的异常时,java虚拟机调用 Thread.getUncaughtExceptionHandler() 方法就返回我们的实例了。
但正常是没有实现UncaughtExceptionHandler接口的,所以如果没有实现UncaughtExceptionHandler接口的话,一般由ThreadGroup 对象来处理,再或者交给系统默认的异常捕获程序。
代码实例:
public class AppException implements UncaughtExceptionHandler {
@Override
public void uncaughtException(Thread thread, Throwable e) {
//字节输出流
ByteArrayOutputStream byteOut = new ByteArrayOutputStream();
//
PrintStream ps = new PrintStream(byteOut);
//把错误信息输入进流里面
e.printStackTrace(ps);
//返回字符串
String error = new String(byteOut.toByteArray());
//这里我添加了时间日期,这样好区分
String errorMessage = getTime() + "\n" + error + "\n";
//通过SharedPreferences来保存
SaveUtil.getInstance().setValue("LastException", errorMessage);
}
private String getTime() {
SimpleDateFormat s = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String time = s.format(new Date());
return time;
}
}
下一步就是实例化这个全局异常捕获类了,我是在Application的实现类里实例化全局异常捕获类的
@Override
public void onCreate() {
super.onCreate();
appexception = AppException.getInstance();
appexception.init(this);
}
如果是通过Application来实例化全局异常类的话,别忘记在AndroidManifest.xml里配置Application