【Android】处理线程中未捕获的异常

devtools/2024/9/20 5:56:03/ 标签: android, mysql, 数据库
需求

项目出现异常问题,获取崩溃信息

实现

定义一个类,实现【Thread.UncaughtExceptionHandler】方法

public class CrashHandler implements Thread.UncaughtExceptionHandler {private static CrashHandler sInstance = new CrashHandler();private Context mContext;private CrashHandler() {}public static CrashHandler getInstance() {return sInstance;}public void init(Context context) {//将当前应用异常处理器改为默认的Thread.setDefaultUncaughtExceptionHandler(this);mContext = context.getApplicationContext();}@Overridepublic void uncaughtException(Thread thread, Throwable ex) {//导入异常信息到SD卡中try {saveExceptionToSDCard(ex);} catch (IOException e) {e.printStackTrace();}ex.printStackTrace();//activity任务栈里,只要还存在activity就会重启,需要将他们都finish掉才真正不会重启,  //有个链接可以看一下   https://www.jianshu.com/p/eb34c5df30e5if(mContext instanceof MyApplication) ((MyApplication)mContext).removeActivityTasks();Process.killProcess(Process.myPid());//直接杀死进程,防止自动重启System.exit(0);}/*** 将异常信息写入SD卡*/private void saveExceptionToSDCard(Throwable e) throws IOException {//如果SD卡不存在或无法使用,则无法将异常信息写入SD卡//得到当前年月日时分秒long current = System.currentTimeMillis();String time = new SimpleDateFormat("yyyy-MM-dd_HH_mm_ss").format(new Date(current));//在定义的Crash文件夹下创建文件File file = new File(FilePathUtil.getFullPath(DManager.ROOT +File.separator+DManager.LOGGER+File.separator+"error") + "crash_" + time + ".txt");try{PrintWriter pw = new PrintWriter(new BufferedWriter(new FileWriter(file)));//写入时间pw.println(time);//写入手机信息dumpPhoneInfo(pw);pw.println();//换行e.printStackTrace(pw);pw.close();//关闭输入流} catch (Exception e1) {Log.e(TAG,"dump crash info failed");}}/*** 获取手机各项信息*/private void dumpPhoneInfo(PrintWriter pw) throws PackageManager.NameNotFoundException {//得到包管理器PackageManager pm = mContext.getPackageManager();//得到包对象PackageInfo pi = pm.getPackageInfo(mContext.getPackageName(),PackageManager.GET_ACTIVITIES);//写入APP版本号pw.print("App Version: ");pw.print(pi.versionName);pw.print("_");pw.println(pi.versionCode);//写入 Android 版本号pw.print("OS Version: ");pw.print(Build.VERSION.RELEASE);pw.print("_");pw.println(Build.VERSION.SDK_INT);//手机制造商pw.print("Vendor: ");pw.println(Build.MANUFACTURER);//手机型号pw.print("Model: ");pw.println(Build.MODEL);//CPU架构pw.print("CPU ABI: ");if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {pw.println(Build.SUPPORTED_ABIS);}else {pw.println(Build.CPU_ABI);}}
}

在这里,我们把异常信息写入到了本地我们指定的文件下面,或者我们也可以将异常信息上传到服务器等方便分析错误异常信息。

在应用程序启动时调用 init 方法,将 CrashHandler 设置为默认的未捕获异常处理器。

当线程中出现未捕获的异常时,uncaughtException 方法会被调用

我们可以在MyApplication类里面调用这个

 CrashHandler.getInstance().init(this);

http://www.ppmy.cn/devtools/113027.html

相关文章

探索CentOS:入门必备基础知识

探索CentOS:入门必备基础知识 CentOS(Community ENTerprise Operating System)是一个基于Red Hat Enterprise Linux(RHEL)的开源操作系统,广泛应用于服务器环境。对于初学者来说,掌握CentOS的基础知识是非常重要的。本文将详细介绍CentOS的安装、基本命令、软件管理、用…

OpenCV结构分析与形状描述符(20)计算一个包围给定点集的最小外接圆函数minEnclosingCircle()的使用

操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 找到一个包围二维点集的最小面积的圆。 该函数使用迭代算法来寻找一个二维点集的最小外接圆。这意味着函数将会通过反复逼近的过程来计算出能够…

嵌入式Linux学习笔记(5)-进程间常见通讯方式(c语言实现)

一、概述 进程间通信(IPC,InterProcess Communication)是指在多个进程之间进行数据传输和共享的机制。在操作系统中,进程是运行中的程序的实例,每个进程都有自己的内存空间和资源。 进程间通信可以用于在不同的进程之间…

网站按钮检测系统源码分享

网站按钮检测检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Computer Vis…

树莓派5上手

1 安装系统 Raspberry Pi OS 是基于 Debian 的免费操作系统,针对 Raspberry Pi 硬件进行了优化。Raspberry Pi OS 支持超过 35,000 个 Debian 软件包。树莓派 5 可以安装各种系统,但是如果对于系统没有特殊的要求,还是安装 Raspberry Pi OS …

基于Keil软件实现读写备份寄存器(江协科技HAL库)

读写备份寄存器实验是基于江协科技STM32的HAL库工程模板创建的(可以在作品“基于江科大STM32创建的HAL库工程模板”中的结尾处获取工程模板的百度网盘链接) 复制“OLED显示”的工程文件——“4-1 OLED显示屏”,并命名为“12-1 读写备份寄存器 ”。打开工程,把下面的程序复…

科技之光,照亮未来之路“2024南京国际人工智能展会”

全球科技产业的版图正以前所未有的速度重构,而位于中国东部沿海经济带的江浙沪地区,作为科技创新与产业升级的高地,始终站在这一浪潮的最前沿。2024年,这一区域的科技盛宴——“2024南京人工智能展会”即将在南京国际博览中心盛大…

Linux基础---08软件的安装

安装方式优缺点编译安装自由定制,但较为繁琐rmp安装安装简单,但需要自己解决依赖,不支持定制yum安装自动解决rmp依赖,但不支持定制(用的更多) 下面就具体介绍三大安装方式: 一.编译安装 用Li…

Spring Boot-WebSocket相关问题

Spring Boot 中的 WebSocket 相关问题及解决方案 WebSocket 是一种双向的实时通信协议,它允许客户端和服务器之间建立持久连接,并在此连接上双向传输数据。与传统的 HTTP 请求-响应模型不同,WebSocket 能够显著减少网络开销和延迟&#xff0…

信息安全数学基础(14)欧拉函数

前言 在信息安全数学基础中,欧拉函数(Eulers Totient Function)是一个非常重要的概念,它与模运算、剩余类、简化剩余系以及密码学中的许多应用紧密相关。欧拉函数用符号 φ(n) 表示,其中 n 是一个正整数。 一、定义 欧…

MySQL索引优化与B+树【后端 14】

MySQL索引优化与B树 在MySQL数据库中,索引是优化查询性能的关键技术之一。B树作为一种广泛使用的索引结构,在MySQL的InnoDB存储引擎中扮演着核心角色。本文将详细介绍B树的结构特点及其在MySQL索引优化中的应用。 B树的结构特点 B树是B-树的一个变体&a…

AIGC图片相关知识和实战经验(Flux.1,ComfyUI等等)

最近看了网上的一些新闻,flux.1火出圈了,因此自己也尝试跑了一下,作图的质量还是蛮高的,在这里做个知识总结回顾。 flux.1是什么? 根据介绍,flux.1是由stable diffusion 一作,Stability AI的核…

计算机二级office操作技巧——Excel篇

文章目录 函数公式总结写在前面五大基本函数sum求和函数average求平均函数max求最大值函数min求最小值函数count求个数函数 rank排名函数if逻辑判断函数条件求个数函数countif单条件求个数函数countifs多条件求个数函数 条件求和函数sumifs多条件求和函数sumproduct乘积求和函数…

stm32单片机个人学习笔记3(GPIO输出)

前言 本篇文章属于stm32单片机(以下简称单片机)的学习笔记,来源于B站教学视频。下面是这位up主的视频链接。本文为个人学习笔记,只能做参考,细节方面建议观看视频,肯定受益匪浅。 STM32入门教程-2023版 细…

【VUE】实现当前页面刷新,刷新当前页面的两个方法(如何在一个页面写一个方法提供给全局其他地方调用)(如何重复调用同一个路由实现页面的重新加载)

实现前端某个页面刷新,非F5整个系统刷新,只刷新内容部分,按具体需求可以采用一下两个方式实现 方法一:路由快速切换实现页面重新加载 特点:只刷新页面而不是整个系统,样式会重新加载 本质:如何…

外包干了半年,快要废了。。。

先说一下自己的情况,普通本科,在外包干了半年多的功能测试,这几年因为大环境不好,我整个人心惊胆战的,怕自己卷铺盖走人了,我感觉自己不能够在这样蹉跎下去了,长时间呆在一个舒适的环境真的会让…

句子成分——每日一划(八)

目录 一、原句 二、第一部分 三、第二部分 一、原句 In class society everyone lives as a member of a particular class, and every kind of thinking, without exception, is stamped with the brand of a class. 来源:二、阶级和阶级斗争 二、第一部分 In…

代码随想录 第九章 动态规划part03 01背包问题 一维 416. 分割等和子集

01背包问题 一维 #include <bits/stdc.h> using namespace std; int main(){int n, bagWeight;cin >> n >> bagWeight;std::vector<int> value(n, 0);std::vector<int> weight(n, 0);for (int i 0; i < n; i) cin >> weight[i];for (…

Dubbo 与 Zookeeper 在项目中的应用:原理与实现详解

引言 在微服务架构日益普及的今天&#xff0c;如何实现服务的高效调用和管理成为了关键问题。Dubbo 作为阿里巴巴开源的高性能 RPC 框架&#xff0c;在分布式服务治理方面具有显著的优势。Zookeeper 作为一款分布式协调服务&#xff0c;能够高效地管理和协调服务节点信息。因此…

Linux 文件 IO 管理(第一讲)

Linux 文件 IO 管理&#xff08;第一讲&#xff09; 回顾 C 语言文件操作&#xff0c;提炼理解新创建的文件为什么被放在可执行文件的同级目录下&#xff1f;上述 log.txt 何时被创建&#xff1f;又是谁在打开它&#xff1f;那文件没有被打开的时候在哪里&#xff1f;一个进程可…