Android全局异常捕获CrashHandler

来源:互联网 发布:手机淘宝怎么刷新 编辑:程序博客网 时间:2024/05/29 03:01

在Android开发中在所难免的会出现程序crash,俗称崩溃。用户的随意性访问出现测试时未知的Bug导致我们的程序crash,此时我们是无法直接获取的错误log的,也就无法修复Bug。这就会极大的影响用户体验,此时我们需要注册一个功能来捕获全局的异常信息,当程序出现crash信息,我们把错误log记录下来,上传到服务器,以便于我们能及时修复bug。实现这个功能我们需要依赖于UncaughtExceptionHandler这个类,UncaughtExceptionHandler是一个接口,在Thread中。里面只有一个方法uncaughtException。当我们注册一个UncaughtExceptionHandler之后,当我们的程序crash时就会回调uncaughtException方法,而uncaughtException方法带有两个参数,参数中就存放这crash信息。接下来只看写代码

package hi.xiaoyu.crashhandler;import java.io.File;import java.io.FileWriter;import java.io.IOException;import java.lang.Thread.UncaughtExceptionHandler;import java.util.Date;import android.content.Context;import android.os.Environment;import android.util.Log;public class CrashHandler implements 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                        + "errorlog.log", true);                fw.write(new Date() + "\n");                // 错误信息                // 这里还可以加上当前的系统版本,机型型号 等等信息                StackTraceElement[] stackTrace = arg1.getStackTrace();                fw.write(arg1.getMessage() + "\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() + "\n");                }                fw.write("\n");                fw.close();                // 上传错误信息到服务器                // uploadToServer();            } catch (IOException e) {                Log.e("crash handler", "load file failed...", e.getCause());            }        }        arg1.printStackTrace();        android.os.Process.killProcess(android.os.Process.myPid());    }}

在Activity或者Application中注册一下即可

CrashHandler crashHandler = CrashHandler.getInstance();        crashHandler.init(getApplicationContext());

这样就实现了Android全局异常的捕获处理。实现起来也比较简单。目前市面上也有第三方的SDK集成了此功能,比如友盟的SDK,几行代码就可实现异常的捕获,并且会自动上传到你自己友盟的工作台,使用起来也是爽爽滴。




package com.lianluo.qingfeng;import android.content.Context;import android.util.Log;import java.lang.Thread.UncaughtExceptionHandler;public class CrashHandler implements UncaughtExceptionHandler {    public static final String TAG = CrashHandler.class.getSimpleName();//使用了饿汉式单例模式    private static CrashHandler INSTANCE = new CrashHandler();    private Thread.UncaughtExceptionHandler mDefaultHandler;    private CrashHandler() {    }    public static CrashHandler getInstance() {        return INSTANCE;    }    public void init(Context ctx) {        mDefaultHandler = Thread.getDefaultUncaughtExceptionHandler();        Thread.setDefaultUncaughtExceptionHandler(this);    }    @Override    public void uncaughtException(Thread thread, Throwable ex) {        ex.printStackTrace();        Log.e("qingfeng", "CrashHandler.uncaughtException 忻风异常捕捉", ex);        try{            Thread.sleep(1000);        }catch (Exception e){}        System.exit(0);        //ZhongSouActivityMgr.getInstance().errorExit();    }}

private void initErrorHandler() {    CrashHandler handler = CrashHandler.getInstance();    handler.init(this);}

在MainActivity 的onCreate方法中调用initErrorHandler()

0 0
原创粉丝点击