您的位置:首页 > 其它

使用UncaughtExceptionHandler捕获错误日志,客户端不会崩溃。

2016-04-28 16:29 513 查看
Java 的异常处理机制中:分为Exception异常和RuntimeException异常,前者必须使用try..catch..来处理,基本上就是System.out.println(e.toString());做一下简单的处理。而RuntimeException异常则是不必须进行try..catch..处理的。现在想在RuntimeException异常时,也进行一些友好的处理,这时就用到了UncaughtExceptionHandler。

/**

 * @description 用于捕获错误日志,RELEASE设置为true之后,客户端不会崩溃

 */

public class MyCrashHandler implements UncaughtExceptionHandler {

    public static final String TAG = MyCrashHandler.class.getSimpleName();

    private static MyCrashHandler crashHandler = new MyCrashHandler();

    // TODO 设为false就不会捕获全局异常

    public static final boolean RELEASE = true;

    private Context mContext;

    private UncaughtExceptionHandler mDefaultHandler;

    private MyCrashHandler() {

    }

    public static MyCrashHandler getCrashHandlerInstances() {

        return crashHandler;

    }

    public void init(Context ctx) {

        mContext = ctx;

        mDefaultHandler = Thread.getDefaultUncaughtExceptionHandler();

        Thread.setDefaultUncaughtExceptionHandler(this);

    }

    @Override

    public void uncaughtException(Thread thread, Throwable ex) {

        if (!handleException(ex) && mDefaultHandler != null) {

            // 如果用户没有处理则让系统默认的异常处理器来处理

            mDefaultHandler.uncaughtException(thread, ex);

        } else {

            // Sleep一会后结束程序

            // 来让线程停止一会是为了显示Toast信息给用户,然后Kill程序

            try {

                Thread.sleep(3000);

            } catch (InterruptedException e) {

            }

            android.os.Process.killProcess(android.os.Process.myPid());

            System.exit(10);

        }

    }

    private boolean handleException(Throwable ex) {

        if (ex == null) {

            return true;

        }

        final String msg = "程序因未知的原因发生崩溃了,3秒后即将退出";

        new Thread() {

            @Override

            public void run() {

                // Toast 显示需要出现在一个线程的消息队列中

                Looper.prepare();

                Toast.makeText(mContext, msg, Toast.LENGTH_LONG).show();

                Looper.loop();

            }

        }.start();

        // 保存错误报告文件    

        saveCrashInfoToFile(ex);

        // 发送错误报告到服务器

        sendCrashReportsToServer();

        return true;

    }

    private void saveCrashInfoToFile(Throwable ex) {

    }

    private void sendCrashReportsToServer() {

    }

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: