全局异常捕捉,以及一些小的知识点

这里有一个很厉害的操作,就是把程序里面的crash准确捕捉,然后打印,存在手机。需要的话也可以上传至服务器,这样的话我们的程序在上线之后,也能知道我们的程序出现了什么样的问题

上代码

public class CrashHandler implements Thread.UncaughtExceptionHandler {
    //文件夹目录
    private static final String PATH = "/sdcard/crash_log";
    //文件名
    private static final String FILE_NAME = "crash";
    //文件名后缀
    public static final String FILE_NAME_SUFFIX = ".trace";
    //上下文
    private Context mContext;
    private static CrashHandler sInstance = new CrashHandler();
    public CrashHandler() {}
    public static CrashHandler getInstance() {
        return sInstance;
    }
    public void init(Context context) {
        //将当前实例设为系统默认的异常处理器
        Thread.setDefaultUncaughtExceptionHandler(this);
        //获取Context,方便内部使用
        mContext = context.getApplicationContext();
    }
    @Override
    public void uncaughtException(Thread thread, Throwable ex) {
        //导出异常息到S信D卡
        dumpExceptionToSDCard(ex);
        //上传异常信息到服务器
        uploadExceptionToServer(ex);
        //延时1秒杀死进程
        SystemClock.sleep(2000);

        Process.killProcess(Process.myPid());
    }
    private void dumpExceptionToSDCard(Throwable ex) {
        if (!Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
            return;
        }
        //创建文件夹
        File dir = new File(PATH);
        if (!dir.exists()) {
            dir.mkdirs();
        }
        //获取当前时间
        long current = System.currentTimeMillis();
        String time = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date(current));
        //以当前时间创建log文件
        File file = new File(PATH + FILE_NAME + time + FILE_NAME_SUFFIX);
        try {
            //输出流操作
            PrintWriter pw = new PrintWriter(new BufferedWriter(new FileWriter(file)));
            //导出手机信息和异常信息
            PackageManager pm = mContext.getPackageManager();
            PackageInfo pi = pm.getPackageInfo(mContext.getPackageName(), PackageManager.GET_ACTIVITIES);
            pw.println("发生异常时间:" + time);
            pw.println("应用版本:" + pi.versionName);
            pw.println("应用版本号:" + pi.versionCode);
            pw.println("android版本号:" + Build.VERSION.RELEASE);
            pw.println("android版本号API:" + Build.VERSION.SDK_INT);
            pw.println("手机制造商:" + Build.MANUFACTURER);
            pw.println("手机型号:" + Build.MODEL);
            ex.printStackTrace(pw);
            //关闭输出流
            pw.close();
        } catch (Exception e) {

        }
    }
    private void uploadExceptionToServer(Throwable ex) {
        Error error = new Error(ex.getMessage());
        /*error.save(new SaveListener<String>() {
            @Override
            public void done(String objectId, BmobException e) {
             }
        });*/
    }
}

然后在全局注册一下

 public class BaseApplication extends AppData {


  @Override
    public void onCreate() {
        super.onCreate();
        CrashHandler crashHandler = CrashHandler.getInstance();
        crashHandler.init(getApplicationContext());
    }




}

这样操作之后,再发生异常,就能自动打印了,如图

这里写图片描述

猜你喜欢

转载自blog.csdn.net/justingwang_1/article/details/78036589