android 全局异常处理封装

app出现了问题,尤其是多线程问题,某个线程出了问题,很不好找,那是不是可以搞一个统一的处理类,将所有的异常信息都统一到一个地方呢,原本只是一个知识点,但我发现这里还可以

保存异常信息到本地或云端,统计异常信息等,所以就封装了一个类

1 用法

开发者只需重写接口中的handException 方法,就可以统一对异常信息进行处理了

具体怎么处理,就看个人的需求了,我这边是就是如果主线程,就走重启app流程,如果是子线程就忽略,当然如果比较重要,也可以走重启app

用法很简单 初始化一下就行:

CrashHandler.getInstance().init(new CrashHandler.CrashListener() {

    @Override
    public boolean handException(Throwable ex) {
        //false : 不处理,true:自己处理
        return false;
    }
});

2 看下具体的代码吧

public class CrashHandler implements Thread.UncaughtExceptionHandler {

    public static final String TAG = "CrashHandler";
    /**
     * 系统默认的UncaughtException处理类
     */
    private Thread.UncaughtExceptionHandler mDefaultHandler;

    private static CrashHandler INSTANCE;
    private CrashListener listener;
    
    private CrashHandler() {

    }

    public interface CrashListener {
        
        boolean handException(Throwable ex);

    }
    
    public static synchronized CrashHandler getInstance() {
        if (INSTANCE == null) {
            INSTANCE = new CrashHandler();
        }
        return INSTANCE;
    }
    
    public void init(CrashListener listener) {
        this.listener = listener;
        //获取系统默认的UncaughtExceptionHandler
        mDefaultHandler = Thread.getDefaultUncaughtExceptionHandler();
        Logger.d(TAG, "init mDefaultHandler : " + mDefaultHandler);
        Thread.setDefaultUncaughtExceptionHandler(this);
    }
    
    @Override
    public void uncaughtException(@NonNull Thread thread, @NonNull Throwable ex) {
        boolean handle = handleException(ex);
        //开发者不处理,用默认的处理类兜底
        if (mDefaultHandler != null && !handle) {
            mDefaultHandler.uncaughtException(thread, ex);
        }
    }

    /**
     * 是否忽略,是否重启,发送错误报告等操作可在此完成.
     * 注意,如果是主线程,是必须要重启的
     */
    private boolean handleException(Throwable ex) {
        boolean handle = false;
        if (listener != null) {
            //捕获监听中异常,防止外部开发者使用方代码抛出异常时导致的反复调用
            try {
                handle = listener.handException(ex);
                Logger.e(TAG, "custom bug end ");
            } catch (Throwable e) {
                Logger.e(TAG, "initCustomBug: ", e);
            }
        }
        return handle;
    }
}

相关推荐

  1. android 全局异常处理封装

    2024-02-22 14:50:02       52 阅读
  2. WPF 全局异常处理

    2024-02-22 14:50:02       60 阅读
  3. Spring全局异常处理

    2024-02-22 14:50:02       60 阅读
  4. 后端异常处理:全局异常处理器

    2024-02-22 14:50:02       47 阅读
  5. SpringBoot中全局异常处理

    2024-02-22 14:50:02       44 阅读
  6. Springboot之全局异常处理

    2024-02-22 14:50:02       52 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-02-22 14:50:02       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-02-22 14:50:02       101 阅读
  3. 在Django里面运行非项目文件

    2024-02-22 14:50:02       82 阅读
  4. Python语言-面向对象

    2024-02-22 14:50:02       91 阅读

热门阅读

  1. C语言内存模型的深度剖析

    2024-02-22 14:50:02       51 阅读
  2. 自然语言转SQL的应用场景探索

    2024-02-22 14:50:02       50 阅读
  3. 剑指offer面试题17 合并俩个排序的列表

    2024-02-22 14:50:02       49 阅读
  4. sqlserver 函数

    2024-02-22 14:50:02       50 阅读
  5. 算法:带权重随机算法

    2024-02-22 14:50:02       49 阅读
  6. spring和springboot的区别,简单直接

    2024-02-22 14:50:02       51 阅读
  7. Python程序员面试准备:八股文题目与解答思路

    2024-02-22 14:50:02       47 阅读
  8. LINUX下载安装go

    2024-02-22 14:50:02       49 阅读
  9. Flutter 启动流程解析

    2024-02-22 14:50:02       45 阅读
  10. 游戏物理引擎+特效系统

    2024-02-22 14:50:02       52 阅读