使用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
- 使用CrashHandler来捕获Crash异常
- 捕获全局异常 CrashHandler
- CrashHandler捕获全局异常
- 自定义异常捕获-CrashHandler
- 使用CrashHandler来获取应用的Crash信息
- 使用CrashHandler来获取应用的oom crash信息
- 使用CrashHandler来获取应用的crash信息
- Android 使用 CrashHandler 来获取应用的 crash 信息
- 使用CrashHandler来获取应用的crash信息
- 使用CrashHandler来获取(收集)应用的crash信息
- android捕获全局异常,CrashHandler
- android捕获全局异常,CrashHandler
- Android全局异常捕获CrashHandler
- android捕获全局异常,CrashHandler
- Android全局异常捕获CrashHandler
- 使用CrashHandler获取crash信息
- 自定义CrashHandler捕获全局未处理异常
- Android 全局异常捕获之CrashHandler
- Visiual Studio2012 CLR20r3问题
- 使用Flexible实现手淘H5页面的终端适配
- JS回调函数全解析教程
- 【Android】抽象布局 — include、merge 、ViewStub
- oracle查看锁表进程以及杀掉锁表进程
- 使用CrashHandler来捕获Crash异常
- DHCP的基本实现原
- ViewPager 实现 GallerView 效果, 显示左右两边 ViewPager Transform 使用详解
- PS域业务与CS域业务的区别
- android中activity的的四种启动模式
- 搭建数据库
- 欢迎使用CSDN-markdown编辑器
- 设计模式--Iterator 模式
- Python—redis