利用UncaughtExceptionHandler捕获全局异常

来源:互联网 发布:网页游戏编程入门 编辑:程序博客网 时间:2024/06/08 08:48

先了解一下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());



0 0