在Android应用开发中,有时需要由应用程序本省获得异常报告并提交给开发者,这样就需要获得App崩溃的信息。利用Java中的UncaughtExceptionHandler可以很方便的实现这个操作。默认情况下,线程执行中发生了未捕获的异常,会由默认的DefaultUncaughtExceptionHandler来处理。为了介入到这个操作中并添加自定义的逻辑,需要继承UncaughtExceptionHandler,然后添加自己的逻辑代码。
代码示例:
import java.lang.Thread.UncaughtExceptionHandler;
import android.content.Context;
public class CrashHandler implements UncaughtExceptionHandler {
private static CrashHandler instance;
private Context mContext;
private Thread.UncaughtExceptionHandler mDefaultHandler;
private CrashHandler() {
}
public static CrashHandler getInstance() {
if (instance == null) {
instance = new CrashHandler();
}
return instance;
}
public void init(Context context) {
mContext = context;
mDefaultHandler = Thread.getDefaultUncaughtExceptionHandler();
Thread.setDefaultUncaughtExceptionHandler(this);
}
@Override
public void uncaughtException(Thread thread, Throwable ex) {
}
}
说明:
- 自定义的处理操作需要添加到public void uncaughtException(Thread thread, Throwable ex)方法中;
- 从ex中可获得追踪的堆栈信息,下面示例是把相关信息保存到文件:
private void save2File (Throwable ex) throws Exception {
StackTraceElement[] stacks = ex.getStackTrace();
File file = BUG_REPORT_FILE;
PrintWriter pw = null;
pw = new PrintWriter(new FileOutputStream(file));
StringBuilder sb = new StringBuilder();
int len = stacks.length;
for (int i = 0; i < len; i++) {
StackTraceElement stack = stacks[i];
sb.setLength(0);
sb.append(stack.getClassName()).append("#");
sb.append(stack.getMethodName()).append(":");
sb.append(stack.getLineNumber());
pw.println(sb.toString());
}
pw.close();
}
- 在uncaughtException中处理未捕获异常时,可以根据自定义操作的完成情况,来选择是否执行默认的mDefaultHandler的uncaughtException操作;
在Activity中的调用方法:
CrashHandler.getInstance().init(this);
至于如何测试,可以throw一个异常:
throw new InvalidParameterException();
或者写一行产生异常的代码:
int a = 0, b = 0;
a = a / b;