app出现了问题,尤其是多线程问题,某个线程出了问题,很不好找,那是不是可以搞一个统一的处理类,将所有的异常信息都统一到一个地方呢,原本只是一个知识点,但我发现这里还可以
保存异常信息到本地或云端,统计异常信息等,所以就封装了一个类
1 用法
开发者只需重写接口中的handException 方法,就可以统一对异常信息进行处理了
具体怎么处理,就看个人的需求了,我这边是就是如果主线程,就走重启app流程,如果是子线程就忽略,当然如果比较重要,也可以走重启app文章来源:https://www.toymoban.com/news/detail-835841.html
用法很简单 初始化一下就行:文章来源地址https://www.toymoban.com/news/detail-835841.html
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; } }
到了这里,关于android 全局异常处理封装的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!