在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);
扫描二维码关注公众号,回复:
724487 查看本文章
至于如何测试,可以throw一个异常:
throw new InvalidParameterException();
或者写一行产生异常的代码:
int a = 0, b = 0; a = a / b;