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
- android捕获全局异常,CrashHandler
- android捕获全局异常,CrashHandler
- Android全局异常捕获CrashHandler
- android捕获全局异常,CrashHandler
- Android全局异常捕获CrashHandler
- 捕获全局异常 CrashHandler
- CrashHandler捕获全局异常
- Android 全局异常捕获之CrashHandler
- Android 全局异常捕获之CrashHandler
- Android 全局异常捕获之CrashHandler
- Android 全局异常捕获之CrashHandler
- Android 全局异常捕获之CrashHandler
- 自定义CrashHandler捕获全局未处理异常
- CrashHandler全局捕获异常,保存本地
- Android 全局异常捕获之CrashHandler,用于开发者收集获取异常信息
- android艺术开发探索之 CrashHandler(全局捕获异常)和应用方法数越界
- Android CrashHandler 自定义崩溃异常捕获
- 自定义异常捕获-CrashHandler
- Mysql优化
- Dojo1.11官方教程文档翻译(5.4)Checkboxes
- ViewFlipper实现垂直轮播广告效果
- 数据结构之红黑树
- 【PAT】1006. Sign In and Sign Out
- Android全局异常捕获CrashHandler
- 无法正常启动DataNode
- leetcode-168-Excel Sheet Column Title
- QImage 与 cv::Mat 之间的相互转换
- 调用微信和支付宝第三方接口方法总结
- JS操作方法
- idea工具debug断点红色变成灰色
- Spark修炼之道——Spark学习路线、课程大纲
- 欢迎使用CSDN-markdown编辑器