一、为什么要Crash
crash可以理解成堕落,垮台。按照我们通俗理解就是android App 因为不可预知的因素导致奔溃。
即使我们的程序发布前,经历了很多的测试,但是经过无数用户各种使用情况之后,可能会发生意想不到的crash.
为了及时反馈bug,通常我们都需要一个crash机制,以让开发人员尽快了解到问题所在,在下个版本中及时改进。
二、如何做到Crash
java的Thread中有一个UncaughtExceptionHandler接口,该接口的作用主要是为了 当 Thread 因未捕获的异常而突然终止时,调用处理程序。
接口下面有setDefaultUncaughtExceptionHandler(Thread.UncaughtExceptionHandler eh)
方法,方法主要作用为设置当线程由于未捕获到异常而突然终止,并且没有为该线程定义其他处理程序时所调用的默认处理程序。
通用demo如下
1 public class DefaultExceptionHandler implements UncaughtExceptionHandler { 2 3 4 5 private Context act = null; 6 7 8 9 public DefaultExceptionHandler(Context act) { 10 11 this.act = act; 12 13 } 14 15 16 17 @Override 18 19 public void uncaughtException(Thread thread, Throwable ex) { 20 21 22 23 // 收集异常信息 并且发送到服务器 24 25 sendCrashReport(ex); 26 27 28 29 // 等待半秒 30 31 try { 32 33 Thread.sleep(500); 34 35 } catch (InterruptedException e) { 36 37 // 38 39 } 40 41 42 43 // 处理异常 44 45 handleException(); 46 47 48 49 } 50 51 52 53 private void sendCrashReport(Throwable ex) { 54 55 56 57 StringBuffer exceptionStr = new StringBuffer(); 58 59 exceptionStr.append(ex.getMessage()); 60 61 62 63 StackTraceElement[] elements = ex.getStackTrace(); 64 65 for (int i = 0; i < elements.length; i++) { 66 67 exceptionStr.append(elements[i].toString()); 68 69 } 70 71 72 73 //TODO 74 75 //发送收集到的Crash信息到服务器 76 77 } 78 79 80 81 private void handleException() { 82 83 //TODO 84 85 //这里可以对异常进行处理。 86 87 //比如提示用户程序崩溃了。 88 89 //比如记录重要的信息,尝试恢复现场。 90 91 //或者干脆记录重要的信息后,直接杀死程序。 92 93 } 94 95 96 97 }