Android全局异常处理UncaughtExceptionHandler

开发中有些地方未注意可能造成异常抛出未能caught到,然后弹出系统对话框强制退出。这种交互不好,而且开发者也不能及时获取到底哪里出问题,当然可以接入第三方Crash分析平台比如Bugly、instabug,其实也可以自己很简单的实现全局异常处理。

未捕获异常大多发生在在多线程环境中,子线程抛出的异常是不能用主线程中try….catch捕获。可以给线程设置UncaughtExceptionHandler,当出现异常时会回调UncaughtExceptionHandler中的uncaughtException(Thread t, Throwable e) 方法。设置可以为某个线程单独设

thread.setUncaughtExceptionHandler(new MyUncaughtExceptionHandler());

当想给所有线程设置时使用

   Thread.setDefaultUncaughtExceptionHandler(new MyUncaughtExceptionHandler());

实现自己的UncaughtExceptionHandler

public class CrashHandler implements Thread.UncaughtExceptionHandler {
    private static final String TAG = "CrashHandler";
    private Context mContext;
    volatile private static CrashHandler sCrashHandler;

    private CrashHandler(Context context) {
        mContext = context;
    }

    public static CrashHandler getInstance(Context context){
        if (sCrashHandler == null) {
            synchronized (CrashHandler.class){
                if (sCrashHandler == null) {
                    //使用Application Context
                    sCrashHandler=new CrashHandler(context.getApplicationContext());
                }
            }
        }
        return sCrashHandler;
    }


    @Override
    public void uncaughtException(Thread t, Throwable e) {
        if (BuildConfig.DEBUG) Log.d(TAG, "uncaughtException: "+t.getName()+" "+e.getMessage());
        //这里可以将异常信息保存或上传
        //...

        //可根据情况选择是否干掉当前的进程
        android.os.Process.killProcess(android.os.Process.myPid());
    }
}

这里自定义的CrashHandler 构造时传入并保存context,以便之后进行异常处理操作,因为使用的单例模式,内部有静态实例,为了防止context引用Activity造成内存泄露,因此使用application context。

在Application中注册未捕获异常处理器

public class CrashApplication extends Application {
    @Override
    public void onCreate() {
        super.onCreate();
        Thread.setDefaultUncaughtExceptionHandler(CrashHandler.getInstance(this));
    }
}

最后manifest中使用CrashApplication

    <application
        android:name=".CrashApplication"
        android:allowBackup="true"
        ...
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 136,174评论 19 139
  • 执行多线程并发任务的时候,如果任务类型相同,一般会考虑使用线程池,一方面利用了并发的优势,一方面避免创建大量线程得...
    德彪阅读 23,662评论 2 19
  • 标题和正文没关系,这要事先声明,我只是在通勤的火车上写这篇文,仅此而已。能把简书当日记的人,我应该是跟大多数人...
    可以啊炜仔阅读 1,751评论 2 1
  • 家这个东西,从来都是定义得很模糊。而随着人的成长,家也在慢慢变化着。 小时候的家,是农舍,是村庄,是田野,是漫天遍...
    会游走的鱼阅读 2,607评论 0 0
  • 她是我的女老板。 我正在办公呢,带着两岁的儿子来到我身边。 “老板,公子,这是干嘛呢?” 老板春风满面,说,他要拉...
    69d3eb42f654阅读 2,047评论 0 0

友情链接更多精彩内容