
Android使用UncaughtExceptionHandler捕获全局异常
发布日期:2021-05-08 00:09:14
浏览次数:28
分类:精选文章
本文共 2644 字,大约阅读时间需要 8 分钟。
UncaughtExceptionHandler可以用来捕获程序异常,例如NullPointerException空指针异常在未被try catch捕获时,系统会弹出对话框提示“XXX程序异常退出”,给用户体验带来不良影响。为了捕获应用运行时异常并提供友好提示,我们可以通过继承UncaughtExceptionHandler类来实现。
CrashHandler类实现
我们可以创建一个CrashHandler类,继承自UncaughtExceptionHandler,来处理程序中的异常。以下是CrashHandler类的实现代码:
public class CrashHandler implements UncaughtExceptionHandler { private static final String TAG = CrashHandler.class.getSimpleName(); private static CrashHandler instance; private OnBeforeHandleExceptionListener mListener; private Context context; private Thread.UncaughtExceptionHandler defaultHandler; private DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd_HH-mm-ss.SSS", Locale.CHINA); private CrashHandler() { } public static CrashHandler getInstance() { if (instance == null) { synchronized (CrashHandler.class) { if (instance == null) { instance = new CrashHandler(); } } } return instance; } public void init(Context context) { this.context = context; defaultHandler = Thread.getDefaultUncaughtExceptionHandler(); Thread.setDefaultUncaughtExceptionHandler(this); } @Override public void uncaughtException(Thread thread, Throwable ex) { if (mListener != null) { mListener.onBeforeHandleException(); } boolean handled = handleException(ex); if (!handled && defaultHandler != null) { defaultHandler.uncaughtException(thread, ex); } else { try { Thread.sleep(3000); } catch (InterruptedException e) { Log.e(TAG, "error:", e); } Process.killProcess(MyProcess.getMyPid()); System.exit(1); } } private boolean handleException(Throwable ex) { if (ex == null) { return false; } new Thread() { @Override public void run() { Looper.prepare(); ex.printStackTrace(); String error = "[" + ex.getMessage() + "]"; Toast.makeText(context, "程序出现异常." + error, Toast.LENGTH_LONG).show(); Looper.loop(); } }.start(); String info = collectDeviceInfo(context, ex); saveCrashInfo2File(info); return true; }}
应用绑定方法
在应用的Application或Activity的onCreate方法中,添加以下两行代码即可:
CrashHandler crashHandler = CrashHandler.getInstance();crashHandler.init(getApplicationContext());
通过这种方式,我们可以确保程序中未被try catch捕获的异常能够被CrashHandler类所处理,并提供友好的用户提示,避免用户感到困惑或程序直接退出。
发表评论
最新留言
感谢大佬
[***.8.128.20]2025年04月06日 18时28分50秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
桌面图标的自动排列图标
2019-03-04
第十一届蓝桥杯python组第二场省赛-数字三角形
2019-03-04
数字三角形的无返回值的深度优先搜索解法
2019-03-04
完全背包问题的简化思路
2019-03-04
Jquery添加元素
2019-03-04
Jquery使用需要下载的文件
2019-03-04
BST中某一层的所有节点(宽度优先搜索)
2019-03-04
广度优先搜索
2019-03-04
猜字母
2019-03-04
Linux网络环境配置(设置ip地址)
2019-03-04
Idea使用Spring Initializr来快速创建springboot项目
2019-03-04
Dijkstra算法的总结
2019-03-04
SpringCloud和SprinBoot之间的关系
2019-03-04
javascript定义变量及数据类型介绍
2019-03-04
C语言的运算符和表达式
2019-03-04
椭圆曲线密码系统——椭圆曲线
2019-03-04
Vue实现选项卡功能
2019-03-04
数据结构——链表
2019-03-04
【Python】面向对象,封装
2019-03-04