1.简单介绍
对于程序抛出的未被捕获的异常,可能会导致程序异常退出,界面不友好且应记录关键错误信息上传至server。
这里主要使用UncaughtExceptionHandler
2.代码实现
public class CrashHandler implements UncaughtExceptionHandler { public static final String TAG = CopyOfCrashHandler.class.getSimpleName(); // 系统默认的UncaughtException处理类 private Thread.UncaughtExceptionHandler mDefaultHandler; private static CopyOfCrashHandler instance; private Context mContext; private CopyOfCrashHandler() { } /** 获取CrashHandler实例 ,单例模式 */ public static CopyOfCrashHandler getInstance() { if (instance == null) instance = new CopyOfCrashHandler(); return instance; } /** * 初始化 */ public void init(Context context) { mContext = context; //记录下默认的UncaughtExceptionHandler mDefaultHandler = Thread.getDefaultUncaughtExceptionHandler(); // Thread.setDefaultUncaughtExceptionHandler(this); } /** * 当UncaughtException发生时会转入该函数来处理 */ @Override public void uncaughtException(Thread thread, Throwable ex) { if (!handleException(thread, ex) && mDefaultHandler != null) { // 假设用户没有处理则让系统默认的异常处理器来处理 mDefaultHandler.uncaughtException(thread, ex); } else { try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } android.os.Process.killProcess(android.os.Process.myPid()); System.exit(1); } } /** * 自己定义错误处理,收集错误信息 发送错误报告等操作均在此完毕. * * @param ex * @return true:假设处理了该异常信息;否则返回false. */ private boolean handleException(Thread thread, Throwable ex) { if (ex == null) { return false; } StringBuffer sb = new StringBuffer(); sb.append(thread + ", Cause By:" + ex).append(" "); StackTraceElement[] elements = ex.getStackTrace(); for (int i = 0; i < elements.length; i++) { sb.append(elements[i].toString() + " "); } //记录下关键错误信息,能够存至本地并上传至server //LogUtil.bug(TAG, sb.toString()); //打开新Activity友好界面提示 //Util.showDialog(mContext, "时间:"+Util.formatSimpleDateAndTime(new Date()), "程序出现异常,请记录时间并提示开发者!"); return true; } }