在开发中,我们会遇到各种各样的异常信息,系统自带的提示很大一部分会影响用户的体验效果,那么怎么解决这一问题,又能让我们知道是哪里出现的错误呢, 这里就需要我们自定义一个全局捕获异常
首先 创建一个CrashHandler 类 继承 Thread.UncaughtExceptionHandler
因为系统就是通过UncaughtExceptionHandler , 来进行异常捕获的, 那么我们也可以通过继承此方法来自定义进行捕获
因为CrashHandler 作为整个app程序当中只要出现的异常都进行捕获, 所以不需要创建出多个对象出来,
public class CrashHandler implements Thread.UncaughtExceptionHandler{
private static CrashHandler crashHandler = null;
private CrashHandler(){
}
public static CrashHandler getInstance() {
if (crashHandler ==null){
crashHandler = new CrashHandler();
}
return crashHandler;
}
private Context mContext;
private Thread.UncaughtExceptionHandler defaultUncaughtExceptionHandler;
//想要将异常捕获 在所有的activity 中都生效 可以将init方法放到 Application 进行统一管理
public void init(Context context) {
//将CrashHandler 作为系统的默认的异常处理器
this.mContext = context;
//获取系统默认的捕获异常处理器
defaultUncaughtExceptionHandler = Thread.getDefaultUncaughtExceptionHandler();
//将我们自己的捕获异常处理器设置为默认的 ( 参数为 this 当前的类)
Thread.setDefaultUncaughtExceptionHandler(this);
}
/**
* 把提示信息进行汉化
* 记录日志信息,反馈到后台
*
* @param thread
* @param ex
*/
@Override
public void uncaughtException(Thread thread, Throwable ex) {
// Log.e("CrashHandler", "捕获异常");
if (isHandle(ex)){
//自定义异常处理
handleException(thread, ex); //自己处理
}else {
defaultUncaughtExceptionHandler.uncaughtException(thread,ex);//系统处理
}
}
/**
* 判断是否需要自己处理
*
* @param ex
* @return
*/
public boolean isHandle(Throwable ex) {
if (ex == null) {
return false;
} else {
return true;
}
}
/**
* 自定义异常处理
* @param thread
* @param ex
*/
private void handleException(Thread thread, Throwable ex) {
new Thread(){
@Override
public void run() {
//因为 CrashHandler 试运行在 独立的 线程中的 所以要手动调用 looper
Looper.prepare(); //开启looper
Toast.makeText(mContext,"系统出现异常,即将退出",Toast.LENGTH_SHORT).show();
Looper.loop(); //开始循环
}
}.start();
/**
* 在关闭之前收集一下异常信息
*/
collectionException(ex);
//程序停止2秒钟 将程序关掉
try {
thread.sleep(2000); android.os.Process.killProcess(android.os.Process.myPid());//杀死当前进程
System.exit(0);//关闭虚拟机,释放所有内存
} catch (InterruptedException e) {
e.printStackTrace();
}
}
/**
* 收集一下异常信息
* @param ex
*/
private void collectionException(Throwable ex) {
final String deviceInfo = Build.DEVICE + Build.VERSION.SDK_INT + Build.MODEL + Build.PRODUCT;
final String errorInfo = ex.getMessage();
new Thread() {
@Override
public void run() {
Log.e("CrashHandler", "deviceInfo---" + deviceInfo + ":errorInfo" + errorInfo);
}
}.start();
}
}
注意:因为一旦有异常 会交给默认的系统捕获 ,如果想要自己的类去处理的话,必须将CrashHandler设置为默认的捕获异常才可以
以上只是简单的讲述了一下 全局异常捕获的 实现逻辑
下面可以参看更加详细的文章: http://blog.csdn.net/jdsjlzx/article/details/7606423