在Android的开发调试使用过程中,对于应用的异常退出,几乎是不可避免的问题,总会有极小概率或者某些偶然的场景我们没有考虑到,导致了应用的异退,如果是不知道规律的时候,我们就很难复现问题,更无从下手去解决问题。
对于上面这种情况,现在通常的解决方式是记录Crash日志,将日志上传服务器或者存储到本地在调试的时候方便查询。
下面我们来看如何捕获异退的日志。
1、首先实现Java中的异常处理接口UncaughtExceptionHandler,重写其uncaughtException方法。
@Override
public void uncaughtException(Thread thread, Throwable ex) {
if (//进行自己的业务逻辑判断) {
//如果用户没有处理则让系统默认的异常处理器来处理 mDefaultHandler通过Thread.getDefaultUncaughtExceptionHandler获取
mDefaultHandler.uncaughtException(thread, ex);
} else {
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
//退出程序
//退出JVM(java虚拟机),释放所占内存资源,0表示正常退出(非0的都为异常退出)
System.exit(0);
//从操作系统中结束掉当前程序的进程
android.os.Process.killProcess(android.os.Process.myPid());
}
}
2、让应用的异常处理使用我们自定义的接口,调用Thread.setDefaultUncaughtExceptionHandler方法,传入我们的自定义异常处理类的对象。
Thread.setDefaultUncaughtExceptionHandler(this);
3、在重写的方法中,插入我们自己的异常处理逻辑。在uncaughtException方法中有参数Throwable,该参数中可以获取堆栈信息等,可以将这些信息格式化为字符串,写入本地某个文件或者传入服务器中,依据实际情况使用。将Throwable堆栈信息转换为String的参考代码如下。
Writer writer = new StringWriter();
PrintWriter printWriter = new PrintWriter(writer);
ex.printStackTrace(printWriter);
Throwable cause = ex.getCause();
while (cause != null) {
cause.printStackTrace(printWriter);
cause = cause.getCause();
}
printWriter.close();
String result = writer.toString();
进行异常捕获的方法就简单介绍到这里了,记得要在Application启动的时候初始化!