安卓全局异常捕获
2016-10-27 14:07
155 查看
因为有个需求是在程序崩溃前发送http请求退出账号,所以写了个全局异常捕获。
后来想到正好帮我测试的同事是黑盒,而且我俩办公地点也不同,不好交流问题。就干脆顺便写个“易懂”的文件用来交流bug。
其实根本原因是这次没有服务器,否则直接上传服务器就更方便了。
在暴风雨来临前,跟我一起做一些事情吧!
接下来就是代码:
在Application中使用:在onCreate方法中调用以下方法
log文件会保存在 内存卡/log/MyErrorLog.log
多次的崩溃信息也会追加在这个文件里面
后来想到正好帮我测试的同事是黑盒,而且我俩办公地点也不同,不好交流问题。就干脆顺便写个“易懂”的文件用来交流bug。
其实根本原因是这次没有服务器,否则直接上传服务器就更方便了。
在暴风雨来临前,跟我一起做一些事情吧!
接下来就是代码:
public class MyCrashHandler implements Thread.UncaughtExceptionHandler { private static MyCrashHandler INSTANCE; private Context context; private SimpleDateFormat dataFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); private MyCrashHandler() { } public static synchronized MyCrashHandler getInstance() { if (INSTANCE == null) INSTANCE = new MyCrashHandler(); return INSTANCE; } public void init(Context context) { this.context = context; } public void uncaughtException(Thread thread, Throwable throwable) { //做一些事情 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 + "MyErrorLog.log", true); StringBuilder erroInfo = new StringBuilder(); StackTraceElement[] stackTrace = throwable.getStackTrace(); erroInfo.append("---------------------------------------------" + "\n") .append("---------------------------------------------" + "\n") .append("崩溃时间:" + dataFormat.format(new Date()) + "\n") .append("手机厂商:" + Build.MANUFACTURER + "\n") .append("手机型号:" + android.os.Build.MODEL + "\n") .append("系统版本:" + android.os.Build.VERSION.RELEASE + "\n") .append("CPU_ABI:" + android.os.Build.CPU_ABI + "\n") .append("CPU_ABI2:" + android.os.Build.CPU_ABI2 + "\n") .append("-------------------错误信息-------------------" + "\n") .append(throwable.getMessage() + "\n") .append("-------------------所在位置-------------------" + "\n"); for (int i = 0; i < stackTrace.length; i++) { erroInfo.append("|---文件名:" + stackTrace[i].getFileName() + "\n" + " |---类名:" + stackTrace[i].getClassName() + "\n" + " |---第" + stackTrace[i].getLineNumber() + "行,方法名:" + stackTrace[i].getMethodName() + "\n"); } erroInfo.append("\n"); fw.write(erroInfo.toString()); fw.close(); // 上传错误信息到服务器 // uploadToServer(); } catch (IOException e) { LogUtil.e("MyCrashHandler:load file failed"); } } LogUtil.e("程序异常退出:" + throwable.getMessage()); android.os.Process.killProcess(android.os.Process.myPid()); } }
在Application中使用:在onCreate方法中调用以下方法
private void initCrashHandler() { MyCrashHandler handler = MyCrashHandler.getInstance(); handler.init(getApplicationContext()); Thread.setDefaultUncaughtExceptionHandler(handler); }
log文件会保存在 内存卡/log/MyErrorLog.log
多次的崩溃信息也会追加在这个文件里面
相关文章推荐
- 安卓全局异常捕获--自定义错误详情页
- 安卓APP崩溃(crash)后重新启动,捕获全局异常重启APP
- 安卓全局异常捕获--自定义错误详情页
- 安卓实现分业务模块异常捕获,全局异常不崩溃,应用继续运行!
- 捕获全局异常
- Spring Boot 全局捕获异常
- iOS 捕获全局异常,统一收集
- python中如何用sys.excepthook来对全局异常进行捕获、显示及输出到error日志中
- 全局异常捕获处理器
- Android全局异常处理(捕获异常,不弹出程序崩溃)
- 【转】UWP 捕获全局异常
- asp.net mvc ,asp.net mvc api 中使用全局过滤器进行异常捕获记录
- 在Android中自定义捕获Application全局异常,可以替换掉系统的强制退出对话框(很有参考价值与实用价值)
- c# winform捕获全局异常,并记录日志
- SpringMVC实现全局异常捕获处理
- C# WinForm捕获全局异常
- 一个好用的全局异常捕获器
- android 捕获全局异常;
- 全局异常捕获
- Android 捕获系统全局异常