介绍
程序总有崩溃的时候,崩溃没关系,只要找出问题解决就好。可是对于普通用户手中的崩溃,咱们每每没办法及时获取用户当时的crash信息。这时候咱们就要用到异常处理器,经过实现UncaughtExceptionHandler
接口,重写uncaughtException
方法来处理代码内部未捕获的异常,也就是运行崩溃异常。java
使用
public class CrashHandler implements Thread.UncaughtExceptionHandler {
private static volatile CrashHandler crashHandler;
private Context context;
private CrashHandler(){}
public void init(Context context){
this.context = context;
Thread.setDefaultUncaughtExceptionHandler(this);
}
public static CrashHandler getCrashHander(){
if (crashHandler == null){
synchronized (CrashHandler.class){
if (crashHandler == null){
crashHandler = new CrashHandler();
}
}
}
return crashHandler;
}
@Override
public void uncaughtException(Thread t, final Throwable e) {
//程序崩溃了,获取错误信息 e.getMessage()
//能够进行保存或者上传到服务器
android.os.Process.killProcess(android.os.Process.myPid())
exitProcess(1)
}
}
public class MyApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
CrashHandler crashHandler = CrashHandler.getCrashHander();
crashHandler.init(this);
}
}
其实重要的就是两步:android
-
首先实现 UncaughtExceptionHandler
接口,而后在他的uncaughtException
方法中获取异常信息,能够进行保存或者上传到服务器进行错误信息分析。 -
而后经过Thread的 setDefaultUncaughtExceptionHandler
方法,将当前类设置成线程默认的异常处理器,而后就能监听到全部线程的错误信息了。
原理
通常状况下,一个应用中所使用的线程都是在同一个线程组,而在这个线程组里只要有一个线程出现未被捕获异常的时候,JAVA 虚拟机就会调用当前线程所在线程组中的 uncaughtException()
方法。web
// ThreadGroup.java
public void uncaughtException(Thread t, Throwable e) {
if (parent != null) {
parent.uncaughtException(t, e);
} else if (Thread.getDefaultUncaughtExceptionHandler() != null) {
// TODO The spec is unclear regarding this. What do we do?
Thread.getDefaultUncaughtExceptionHandler().uncaughtException(t, e);
} else if (!(e instanceof ThreadDeath)) {
// No parent group, has to be 'system' Thread Group
e.printStackTrace(System.err);
}
}
而后这个方法就比较简单了,当getDefaultUncaughtExceptionHandler()
方法所获取的异常处理器不为空时,就会把异常传到uncaughtException方法中。因此咱们以前经过setDefaultUncaughtExceptionHandler
方法设置了异常处理器为咱们本身的CrashHandler,异常就会回调给CrashHandler的uncaughtException
方法。服务器
本文分享自微信公众号 - 码上积木(Lzjimu)。
若有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一块儿分享。微信