全局异常捕获(UncaughtExceptionHandler)

一, 简介
大家都知道, 现在安装Android系统的手机版本和设备千差万别, 在模拟器上运行良好的程序安装到某款手机上说不
定就出现崩溃的现象, 开发者个人不可能购买所有设备逐个调试, 所以在程序发布出去之后, 如果出现了崩溃现象, 开
发者应该及时获取在该设备上导致崩溃的信息, 这对于下一个版本的bug修复帮助极大, 所以今天就来介绍一下如何在程
序崩溃的情况下收集相关的设备参数信息和具体的异常信息, 也就是Android开发中的全局异常的捕获; ( Umeng统计就
是利用全局异常捕获的错误信息)
二, 全局异常在Android中的使用
Android中全局异常的捕获是通过实现UncaughtExceptionHandler接口来实现的;
使用步骤:
1, 写一个自定义类CrashHandler并实现UncaughtExceptionHandler接口,并实现抽象方法;
2, CrashHandler写成单例模式并在Application中进行初始化;
3, 在uncaughtException方法中写捕获到异常的逻辑;
代码如下:
/**
* Description: Application中初始化
*/
public class MyApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
CrashHandler.getInstance().init(this);
}
}
/**
* Description: 全局异常捕获类
*/
public class CrashHandler implements Thread.UncaughtExceptionHandler {
private static CrashHandler crashHandler;
private Context context;
// 系统默认的 UncaughtException 处理类
private Thread.UncaughtExceptionHandler mDefaultHandler;
private CrashHandler() {
publi
c synchronized static CrashHandler getInstance() {
if (crashHandler == null) {
crashHandler newCrashHandler();
}re
turn crashHandler;
/*
*
初始化UncaughtExceptionHandler
@param context
*/
public void init(Context context){
this.context = context;
mDefaultHandler = Thread.getDefaultUncaughtExceptionHandler();
Thread.setDefaultUncaughtExceptionHandler(crashHandler);
@
Override
public void uncaughtException(Thread thread, Throwable throwable) {
if (!handleException(throwable) && mDefaultHandler != null){
mDefaultHandler.uncaughtException(thread,throwable);//交给系统处理错误
}else {//自己做处理
}
/*
*
* * 自定义错误处理,收集错误信息1q
* * 发送错误报告等操作均在此完成.
* * 开发者可以根据自己的情况来自定义异常处理逻辑
* * @return
* * true代表处理该异常, 不再向上抛异常,
* * false代表不处理该异常(可以将该log信息存储起来)然后交给上层(这里就到了系统的异常处理)去处理,
* * 简单来说就是true不会弹出那个错误提示框, false就会弹出
**/
private boolean handleException(final Throwable ex) {
if (ex == null) {
return false;
}S
tring err_message = getStack(ex);;//此处可以讲错误信息和设备信息发送到远程服务器Log.e("exception","异常信息: "+err_message);return true;} private String getStack(Throwable e) {String error = null;if (e != null) {ByteArrayOutputStreambaos = null;PrintStreamps = null;try {baos = newByteArrayOutputStream();ps = newPrintStream(baos);e.printStackTrace(ps);error = baos.toString();baos.close();ps.close();} catch (Exception e1) {error = e.toString();} finally {baos = null;ps = null;}}return error;}} Ume

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值