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

来源:互联网 发布:电脑的端口 编辑:程序博客网 时间:2024/06/04 20:23

这里有一个很厉害的操作,就是把程序里面的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());    }}

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

这里写图片描述

原创粉丝点击