先了解一下UncaughtExceptionHandler这个类,它的名字叫做未捕获异常处理器,当系统出现未捕获异常时,系统默认会弹出强制关闭窗口,用户体验非常不好,我们可以实现这个接口,可以做一些自定义的界面,并可以把异常信息保存到文本中,发送到服务器,一遍我们发现bug
定义一个类,实现这个接口
public class ErrorHandler implements Thread.UncaughtExceptionHandler {
private Thread.UncaughtExceptionHandler mDefaultHandler;
private Context mContext;
//用来存储异常信息
private Map<String, String> infos = new HashMap<String, String>();
//创建唯一对象
private static CrashHandler INSTANCE = new CrashHandler();
/**
* 保证只有一个CrashHandler对象
*/
private CrashHandler() {
}
/**
* 获取CrashHandler实例
*/
public static CrashHandler getInstance() {
return INSTANCE;
}
public void init(Context context) {
mContext = context;
//获取系统默认的UncaughtException处理器
mDefaultHandler = Thread.getDefaultUncaughtExceptionHandler();
//设置该CrashHandler为程序的默认处理器
Thread.setDefaultUncaughtExceptionHandler(this);
}
/**
* 当未捕获异常发生时转入该函数来处理
*
* @param thread
* @param ex
*/
@Override
public void uncaughtException(Thread thread, Throwable ex) {
if (!handlerException(ex) && mDefaultHandler != null) {
mDefaultHandler.uncaughtException(thread, ex);
} else {
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
Log.e("TAG", "error :", e);
}
android.os.Process.killProcess(android.os.Process.myPid());
System.exit(1);
}
}
/**
* 在这里面自定义处理异常
*
* @param ex
* @return
*/
private boolean handlerException(Throwable ex) {
if (ex == null) {
return false;
}
new Thread() {
@Override
public void run() {
Looper.prepare();
Toast.makeText(mContext, "程序挂了,马上退出", Toast.LENGTH_LONG).show();
Looper.loop();
}
}.start();
return true;
}
在Application中初始化:
ErrorHandler errorHandler = ErrorHandler.getInstance();
errorHandler.init(getApplicationContext());