前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >安卓程序崩溃错误捕捉

安卓程序崩溃错误捕捉

原创
作者头像
谭广健
修改2019-11-13 17:03:02
1.1K0
修改2019-11-13 17:03:02
举报
文章被收录于专栏:谭广健的专栏谭广健的专栏

在开发安卓程序时,本地测试没任何问题,但去到客户处不是这里麻烦就是哪里不行。最后还来个程序崩溃。。最令人头疼的就是崩溃,因为程序的崩溃总是悄然无息的,有时候根本都没办法进行复现处理,,经过一段的摸索后,总算发现安卓有个程序崩溃前的接口(CrashHandler)在崩溃前会执行,这样就能很好的捕获到错误了。

好吧,估计大家都是伸手党,,直接上代码。

新建一个CrashHandler.java文件,内容如下:

代码语言:javascript
复制
public class CrashHandler implements Thread.UncaughtExceptionHandler {
    private static CrashHandler instance;

    public static CrashHandler getInstance() {
        if (instance == null) {
            instance = new CrashHandler();
        }
        return instance;
    }

    public void init(Context ctx) {
        Thread.setDefaultUncaughtExceptionHandler(this);
    }

    /**
     * 核心方法,当程序crash 会回调此方法, Throwable中存放这错误日志
     */
    @Override
    public void uncaughtException(Thread arg0, Throwable arg1) {

        String logPath;
        if (Environment.getExternalStorageState().equals(
                Environment.MEDIA_MOUNTED)) {
            logPath = Environment.getExternalStorageDirectory()
                    .getAbsolutePath()
                    + File.separator
                    + File.separator
                    + "log";
            File file = new File(logPath);
            if (!file.exists()) {
                file.mkdirs();
            }
            try {
                FileWriter fw = new FileWriter(logPath + File.separator
                        + "E"+AppTimeUtils.formatDate(new Date(), "yyMMdd")+"log.log", true);
                fw.write(new Date() + "\r\n");
                fw.write("MedchCode:"+AppInfoKeeper.getMedchCode()+ "\r\n");
                StackTraceElement[] stackTrace = arg1.getStackTrace();
                fw.write(arg1.getMessage() + "\r\n");
                for (int i = 0; i < stackTrace.length; i++) {
                    fw.write("file:" + stackTrace[i].getFileName() + " class:"
                            + stackTrace[i].getClassName() + " method:"
                            + stackTrace[i].getMethodName() + " line:"
                            + stackTrace[i].getLineNumber() + "\r\n");
                }
                fw.write("\r\n");
                fw.write("------------over_it-----------------");
                fw.close();
                ToastUtils.showToast("系统发生故障,请联系管理员。");
                //WriteLog.writeTxtToFile("File_url==>"+logPath + File.separator + "E"+AppTimeUtils.formatDate(new Date(), "yyMMdd")+"log.log");
                // 上传错误信息到服务器
                // uploadToServer();
            } catch (IOException e) {

                WriteLog.writeTxtToFile("load file failed..."+ e.getCause());
            }
        }
        arg1.printStackTrace();
        android.os.Process.killProcess(android.os.Process.myPid());
    }
}

记得在MainActivity的onCreate里面加入:

代码语言:javascript
复制
CrashHandler crashHandler=CrashHandler.getInstance();
crashHandler.init(this);

就搞掂了。。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档