使用CrashHandler来捕获Crash异常

来源:互联网 发布:中级js面试题及答案 编辑:程序博客网 时间:2024/05/14 14:34

对于android 中未捕获到的异常可以通过UnCaughtExceptionHandler
来进行捕获

/**     * Implemented by objects that want to handle cases where a thread is being     * terminated by an uncaught exception. Upon such termination, the handler     * is notified of the terminating thread and causal exception. If there is     * no explicit handler set then the thread's group is the default handler.     */    public static interface UncaughtExceptionHandler {        /**         * The thread is being terminated by an uncaught exception. Further         * exceptions thrown in this method are prevent the remainder of the         * method from executing, but are otherwise ignored.         *         * @param thread the thread that has an uncaught exception         * @param ex the exception that was thrown         */        void uncaughtException(Thread thread, Throwable ex);    }

他是Thread中的一个内部静态接口,主要通过uncaughtException方法进行处理异常
很显然对这个接口他会抛出get,set方法

  /**     * Sets the default uncaught exception handler. This handler is invoked in     * case any Thread dies due to an unhandled exception.     *     * @param handler     *            The handler to set or null.     */    public static void setDefaultUncaughtExceptionHandler(UncaughtExceptionHandler handler) {        Thread.defaultUncaughtHandler = handler;    }
 /**     * Returns the default exception handler that's executed when uncaught     * exception terminates a thread.     *     * @return an {@link UncaughtExceptionHandler} or <code>null</code> if     *         none exists.     */    public static UncaughtExceptionHandler getDefaultUncaughtExceptionHandler() {        return defaultUncaughtHandler;    }

所以我们由此可以自定义一个CrashHandler来实现这个UncaughtExceptionHandler来处理未捕获到的异常

import android.content.Context;import android.content.pm.PackageInfo;import android.content.pm.PackageManager;import android.os.Build;import android.os.Environment;import android.widget.Toast;import com.orhanobut.logger.Logger;import java.io.BufferedWriter;import java.io.File;import java.io.FileWriter;import java.io.IOException;import java.io.PrintWriter;import java.lang.Thread.UncaughtExceptionHandler;import java.text.SimpleDateFormat;import java.util.Date;/** * author:sparkhuu * email:sparkhuu@gmail.com */public class CrashHandler implements UncaughtExceptionHandler {    private static final String TAG = "CrashHandler";    private static final boolean DEBUG = true;    private static final String PATH = Environment.getExternalStorageDirectory().getPath() + "/CrashText/log/";    private static final String FILE_NAME = "crash";    private static final String FILE_NAME_SUFFIX = ".trace";    private static CrashHandler sInstance = new CrashHandler();    private UncaughtExceptionHandler mDefaultCrashHandler;    private Context mContext;    private CrashHandler(){}    public static CrashHandler getsInstance(){        return sInstance;    }    public void init(Context context){        mDefaultCrashHandler = Thread.getDefaultUncaughtExceptionHandler();        Thread.setDefaultUncaughtExceptionHandler(this);        mContext = context;    }    /**     * 当程序中有未捕获的异常,系统会自动调用此方法     * @param thread 出现未捕获异常的线程     * @param ex 未捕获的异常     */    @Override    public void uncaughtException(Thread thread, Throwable ex) {        try {            //导出异常信息导SD卡            dumpExceptionToSDCard(ex);            //上传异常信息导服务器            uploadExceptionToServer();        } catch (Exception e) {            e.printStackTrace();        }        ex.printStackTrace();        if (null != mDefaultCrashHandler){            mDefaultCrashHandler.uncaughtException(thread, ex);        } else {            Toast.makeText(mContext, ex.getMessage(), Toast.LENGTH_SHORT).show();        }    }    private void uploadExceptionToServer(){    }    private void dumpExceptionToSDCard(Throwable ex) throws IOException {        if (!Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){            if (DEBUG){                Logger.i(TAG + "sdCard unmounted, skip dump exception");                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));        File file = new File(PATH + FILE_NAME + time + FILE_NAME_SUFFIX);        try {            PrintWriter pw = new PrintWriter(new BufferedWriter(new FileWriter(file)));            pw.println();            dumpPhoneInfo(pw);            ex.printStackTrace();            pw.close();        }catch (Exception e) {            Logger.e(TAG + "dump crash info failed");        }    }    private void dumpPhoneInfo(PrintWriter pw) throws PackageManager.NameNotFoundException {        PackageManager pm = mContext.getPackageManager();        PackageInfo pi = pm.getPackageInfo(mContext.getPackageName(), PackageManager.GET_ACTIVITIES);        pw.print("App version:");        pw.print(pi.versionName);        pw.print("-");        pw.println(pi.versionCode);        //Android版本号        pw.print("OS version:");        pw.print(Build.VERSION.RELEASE);        pw.print("-");        pw.println(Build.VERSION.SDK_INT);        // 手机制造商        pw.print("Vendor:");        pw.println(Build.MANUFACTURER);        // 手机型号        pw.print("Model:");        pw.println(Build.MODEL);        //cpu架构        pw.print("CPU ABI:");        pw.println(Build.CPU_ABI);    }}

最后在Application中进行初始化

        CrashHandler.getsInstance().init(this);

也可以通过tencent的bugly集成来满足开发需求地址为
bugly地址

1 0
原创粉丝点击