在项目中,需要全部捕获崩溃异常,并打印日志.
在android项目中,捕获异常需要实现UncaughtExceptionHandler这个接口.实现Thread.UncaughtExceptionHandler接口并复写uncaughtException(Thread thread, Throwable ex)方法来实现对运行时线程进行异常处理.实现 UncaughtExceptionHandler接口,并在uncaughtException方法中处理异常,这里我们关闭App并启动我们需要的Activity.
/** * 异常崩溃捕捉 * Created by lenew on 2017/5/8. */ public class CrashHandler implements UncaughtExceptionHandler { private UncaughtExceptionHandler mDefaultHandler; private static CrashHandler instance; private Context mContext; private DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd-HH-mm-ss"); private CrashHandler() { } public static CrashHandler getInstance() { if (instance == null) { instance = new CrashHandler(); } return instance; } public void init(Context context) { this.mContext = context; this.mDefaultHandler = Thread.getDefaultUncaughtExceptionHandler(); Thread.setDefaultUncaughtExceptionHandler(this); } public void uncaughtException(Thread thread, Throwable ex) { if (!this.handleException(ex) && this.mDefaultHandler != null) { this.mDefaultHandler.uncaughtException(thread, ex); } else { try { Thread.sleep(3000L); } catch (InterruptedException var4) { ; } Process.killProcess(Process.myPid()); System.exit(1); } } private boolean handleException(Throwable ex) { if (ex == null) { return false; } else { (new Thread() { public void run() { Looper.prepare(); Toast.makeText(CrashHandler.this.mContext, "很抱歉,程序出现异常,即将退出.", Toast.LENGTH_SHORT).show(); Looper.loop(); } }).start(); try { this.saveCatchInfo2File(ex); } catch (Exception var3) { var3.printStackTrace(); } return true; } } private String saveCatchInfo2File(Throwable ex) { StringBuffer sb = new StringBuffer(); String time = this.formatter.format(new Date(System.currentTimeMillis())); sb.append("-------------------------------->" + time + "<--------------------------------------" + "\r\n"); StringWriter writer = new StringWriter(); PrintWriter printWriter = new PrintWriter(writer); ex.printStackTrace(printWriter); for (Throwable cause = ex.getCause(); cause != null; cause = cause.getCause()) { cause.printStackTrace(printWriter); } printWriter.close(); String result = writer.toString(); sb.append(result); String pkgName = this.mContext.getPackageName(); Log.e("--------->" + pkgName + " error :", sb.toString()); UObjectIO.writeString(sb.toString() + "\r\n", BasePath.getSDCachePath() + "log.txt"); return null; } private void sendCrashLog2PM(String fileName) { if (!(new File(fileName)).exists()) { Toast.makeText(this.mContext, "日志文件不存在!", 0).show(); } else { FileInputStream fis = null; BufferedReader reader = null; String s = null; try { fis = new FileInputStream(fileName); reader = new BufferedReader(new InputStreamReader(fis, "GBK")); while (true) { s = reader.readLine(); if (s == null) { break; } Log.i("info", s.toString()); } } catch (FileNotFoundException var16) { var16.printStackTrace(); } catch (IOException var17) { var17.printStackTrace(); } finally { try { reader.close(); fis.close(); } catch (IOException var15) { var15.printStackTrace(); } } } } }