我的编程空间,编程开发者的网络收藏夹
学习永远不晚

如何在Android中使用CrashHandler获取应用的crash信息

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

如何在Android中使用CrashHandler获取应用的crash信息

如何在Android中使用CrashHandler获取应用的crash信息?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。

一、Thread 类中的 setDefaultUncaughtExceptionHandler

public static void setDefaultUncaughtExceptionHandler(UncaughtExceptionHandler handler) {    Thread.defaultUncaughtHandler = handler;  }

这个方法其实就可以解决我们应用程序的 crash 问题,设置系统默认异常处理器,当系统发生crash 时,系统就会回调 UncaughtExceptionHandler 的 uncaughtException 方法,在 uncaughtException 方法中就可以获取到异常信息,可以选择把异常信息存储下来,存储方式大家可以自己选择,然后在合适的时候通过网络将 crash 信息上传到服务器上,这样我们开发人员就可以分析用户 crash 的场景从而在后面的版本中进行修复,我们还可以在发生 crash 发生时弹出一个对话框,告诉用户程序 crash 了,然后再退出

二、实现自己的异常捕获类

1)建立异常 Handler,命名为 CrashHandler,代码如下

 public class CrashHandler implements Thread.UncaughtExceptionHandler {    private static final String TAG = "CrashHandler";   private static final boolean DEBUG = true;    private static final String PATH = Environment.getExternalStorageDirectory().getPath() + "/ryg_test/log/";   private static final String FILE_NAME = "crash";    //log文件的后缀名   private static final String FILE_NAME_SUFFIX = ".trace";    private static CrashHandler sInstance = new CrashHandler();    //系统默认的异常处理(默认情况下,系统会终止当前的异常程序)   private Thread.UncaughtExceptionHandler mDefaultCrashHandler;    private Context mContext;    //构造方法私有,防止外部构造多个实例   private CrashHandler() {   }    public static CrashHandler getInstance() {     return sInstance;   }        public void init(Context context) {     //获取系统默认的异常处理器     mDefaultCrashHandler = Thread.getDefaultUncaughtExceptionHandler();     //将当前实例设为系统默认的异常处理器     Thread.setDefaultUncaughtExceptionHandler(this);     //获取Context,方便内部使用     mContext = context.getApplicationContext();   }       @Override   public void uncaughtException(Thread thread, Throwable throwable) {     try {       //导出异常信息到SD卡中       dumpExceptionToSDCard(throwable);       //这里可以通过网络上传异常信息到服务器,便于开发人员分析日志从而解决bug       uploadExceptionToServer();     } catch (IOException e) {       e.printStackTrace();     }      //打印出当前调用栈信息     throwable.printStackTrace();      //如果系统提供了默认的异常处理器,则交给系统去结束我们的程序,否则就由我们自己结束自己     if (mDefaultCrashHandler != null) {       mDefaultCrashHandler.uncaughtException(thread, throwable);     } else {       android.os.Process.killProcess(android.os.Process.myPid());     }   }       private void dumpExceptionToSDCard(Throwable throwable) throws IOException {     //如果SD卡不存在或无法使用,则无法把异常信息写入SD卡     if (!Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {       if (DEBUG) {         Log.w(TAG, "sdcard unmounted,skip dump exception");         return;       }     }      File dir = new File(PATH);     if (!dir.exists()) {       dir.mkdirs();     }     long current = System.currentTimeMillis();     String time = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date(current));     //以当前时间创建log文件     File file = new File(PATH + FILE_NAME + time + FILE_NAME_SUFFIX);      try {       PrintWriter pw = new PrintWriter(new BufferedWriter(new FileWriter(file)));       //导出发生异常的时间       pw.println(time);        //导出手机信息       dumpPhoneInfo(pw);        pw.println();       //导出异常的调用栈信息       throwable.printStackTrace(pw);        pw.close();     } catch (Exception e) {       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);     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: ");     pw.println(Build.CPU_ABI);   }       private void uploadExceptionToServer() {     //在这里写上传到服务器的逻辑   } }

从上面的代码可以看出,当应用程序崩溃时,CrashHandler 类会将异常信息以及设备信息写入 SD 卡,这里大家也可以根据自己项目需要进行处理,例如也可以存储在数据库中,接着将异常交给系统处理,系统会帮我们中止程序,如果系统没有默认的异常处理机制,那么就自行中止,当然而又可以选择将异常信息上传到服务器,这里我们没有实现这个逻辑,实际开发中都需要将异常信息上传到服务器

三、如何使用 CrashHandler

其实使用 CrashHandler 也非常简单,我们可以在 Application 初始化的时候来设置 CrashHandler,如下所示:

  public class App extends Application {   @Override   public void onCreate() {     super.onCreate();     init();   }    private void init() {     //初始化异常捕获类 CrashHandler     CrashHandler.getInstance().init(this);   } }

看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注编程网行业资讯频道,感谢您对编程网的支持。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

如何在Android中使用CrashHandler获取应用的crash信息

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

如何在Android中使用CrashHandler获取应用的crash信息

如何在Android中使用CrashHandler获取应用的crash信息?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。一、Thread 类中的 setDefa
2023-05-30

Android 中Crash时如何获取异常信息详解及实例

Android 中Crash时如何获取异常信息详解 前言:大家都知道,Android应用不可避免的会发生crash,无论你的程序写的多完美,总是无法完全避免crash的发生,可能是由于Android系统底层的bug,也可能是由于不充分的机型
2022-06-06

如何在Android应用中利用Intent实现获取联系人的信息

今天就跟大家聊聊有关如何在Android应用中利用Intent实现获取联系人的信息,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。Intent的使用intent是一个好东西他可以启动A
2023-05-31

如何在Android中获取系统储存信息

这篇文章给大家介绍如何在Android中获取系统储存信息,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。获取SD卡上的储存信息: priva
2023-05-30

在java中如何使用反射获取泛型信息

ParameterizedType就是参数化类型的意思。解释:声明类型中带有“”的都是参数化类型,比如List,Map。getActualTypeArguments()返回Type[],即“”里的参数,比如Map。getRawType()返回Tpye,得到“”
在java中如何使用反射获取泛型信息
2019-10-08

Android 中怎么利用ApplicationInfo获取应用程序信息

这篇文章给大家介绍Android 中怎么利用ApplicationInfo获取应用程序信息,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。Android ApplicationInfo 应用程序信息1、简述1 Appli
2023-05-30

如何在Linux中使用netstat命令获取网络信息

这篇文章将为大家详细讲解有关如何在Linux中使用netstat命令获取网络信息,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。netstat - 显示网络连接,路由表,接口状态,伪装连接,网
2023-06-12

如何使用 PHP 反射在函数中获取参数信息?

php 反射可通过 reflectionfunction 类和 reflectionparameter 对象获取函数参数信息,包括:getname(): 参数名称gettype(): 参数类型isoptional(): 可选性ispasse
如何使用 PHP 反射在函数中获取参数信息?
2024-04-11

android如何获取正在运行的应用

可以使用ActivityManager类来获取正在运行的应用。以下是一个示例代码:```javaimport android.app.ActivityManager;import android.content.Context;import
2023-09-26

如何使用VBS从XML文件中获取信息

小编给大家分享一下如何使用VBS从XML文件中获取信息,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧! 代码如下:*************************
2023-06-08

如何在android 中获取本机其他app的版本信息

如何在android 中获取本机其他app的版本信息?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。先建一个实体类,用来存放app信息。package com.z
2023-05-30

在Android Studio中使用BaiduMap SDK实时获取当地位置信息

配置BaiduMap 环境1.在百度API中新建自己的一个APP包名和APP名需要注意和自己Android Studio 中的包名和APP名保持一致;2.百度地图中还需要填写一个SHA1 数字签名:a、输入keytool -list -v
2022-06-06

Android中怎么使用GPS和NetWork获取定位信息

在Android中,可以通过以下步骤使用GPS和NetWork获取定位信息:在AndroidManifest.xml文件中添加定位权限:在Activity中创建一个LocationManager对象,并注册定位监听器:// 获取Locati
2023-10-24

如何使用golang中的os.Stat函数获取文件的信息

如何使用golang中的os.Stat函数获取文件的信息,需要具体代码示例作为一种现代化的编程语言,Golang(也称为Go)为开发者提供了丰富的标准库,其中包含了丰富的文件和目录操作功能,满足了大多数编程需求。其中,os包是Golang中
如何使用golang中的os.Stat函数获取文件的信息
2023-11-18

微信小程序中如何使用wx.getImageInfo()获取图片信息

本文将为大家详细介绍“微信小程序中如何使用wx.getImageInfo()获取图片信息”,内容步骤清晰详细,细节处理妥当,而小编每天都会更新不同的知识点,希望这篇“微信小程序中如何使用wx.getImageInfo()获取图片信息”能够给
2023-06-26

Linux下如何使用Inxi获取系统信息

这篇文章给大家分享的是有关Linux下如何使用Inxi获取系统信息的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。Inxi 最初是为控制台和 IRC(网络中继聊天)开发的一个强大且优秀的命令行系统信息脚本。可以使用
2023-06-27

android中是如何获取联系人所有信息的

这篇文章将为大家详细讲解有关android中是如何获取联系人所有信息的,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。工具类:package com.example.test;import j
2023-05-30

Win10 9926如何使用全新的地图应用以便获取更多信息

Win10 9926的新特性中包括全新的地图应用,它吸收吸收了《HERE地图》编程、《HERE Drive+》和《Bing 3D地图》的优点,用户可以更好地从地图应用获取更多信息。Win10 9926地图如何使用呢?在Windows 10
2023-06-11

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录