一、为什么要Crash
crash可以理解成堕落,垮台。按照我们通俗理解就是android App 因为不可预知的因素导致奔溃。
即使我们的程序发布前,经历了很多的测试,但是经过无数用户各种使用情况之后,可能会发生意想不到的crash.
为了及时反馈bug,通常我们都需要一个crash机制,以让开发人员尽快了解到问题所在,在下个版本中及时改进。
二、如何做到Crash
java的Thread中有一个UncaughtExceptionHandler接口,该接口的作用主要是为了 当 Thread 因未捕获的异常而突然终止时,调用处理程序。
接口下面有setDefaultUncaughtExceptionHandler(Thread.UncaughtExceptionHandler eh)
方法,方法主要作用为设置当线程由于未捕获到异常而突然终止,并且没有为该线程定义其他处理程序时所调用的默认处理程序。
方法一
通用demo如下
public class DefaultExceptionHandler implements UncaughtExceptionHandler {
private Context act = null;
public DefaultExceptionHandler(Context act) {
this.act = act;
}
@Override
public void uncaughtException(Thread thread, Throwable ex) {
// 收集异常信息 并且发送到服务器
sendCrashReport(ex);
// 等待半秒
try {
Thread.sleep(500);
} catch (InterruptedException e) {
}
// 处理异常
handleException();
}
private void sendCrashReport(Throwable ex) {
StringBuffer exceptionStr = new StringBuffer();
exceptionStr.append(ex.getMessage());
StackTraceElement[] elements = ex.getStackTrace();
for (int i = 0; i < elements.length; i++) {
exceptionStr.append(elements[i].toString());
}
//发送收集到的Crash信息到服务器
}
private void handleException() {
//这里可以对异常进行处理。
//比如提示用户程序崩溃了。
//比如记录重要的信息,尝试恢复现场。
//或者干脆记录重要的信息后,直接杀死程序。
}
}
在主线程中调用
Thread.setDefaultUncaughtExceptionHandler(new DefaultExceptionHandler(
this.getApplicationContext()));
方法二
在自定的Application中的生命周期onCreate初始化
首先,在AndroidManifest.xml中的application节点中配置name
<application
android:name="com.newland.mbop.application.CrashHandlerApp">
CrashHandlerApp中初始化CrashHandler(实现UncaughtExceptionHandler的实现类)
@Override
public void onCreate() {
CrashHandler ch = CrashHandler.getInstance();
ch.init(this);
super.onCreate();
}
需要注意的一点,异常处理完毕以后,一定要写退出应用的代码