基于一个异常捕获功能的知识点梳理

最近做的项目恰好需要捕获一个异常来解决一个崩溃问题,于是自己找了网上一个异常捕获的例子,几乎是原封不动的把人家的例子拿来用了。用归用,原理还是要知道的,于是写一篇文章来总结异常捕获涉及的知识点。

原文链接:Android全局捕获崩溃异常记录日志

一、如何捕获一个异常崩溃

1、UncaughtExceptionHandler了解一下

如上图,UncaughtExceptionHandler是Thread类中的一个接口。其中只有一个方法,uncaughtException,当某一线程因未捕获的异常而即将终止时,Java虚拟机会根据Thread的getUncaughtExceptionHandler来获取该线程的UncaughtExceptionHandler并调用uncaughtException方法来处理。如果线程没有明确设置UncaughtExceptionHandler,则会使用默认的异常捕获处理handler与方法。

通过继承此接口,并重写uncaughtException方法就可以来实现我们想要的异常捕获处理操作了。

自定义的异常捕获类通常使用单例模式,在应用初始化阶段通过使用application的上下文注册。类中持有一个默认的异常捕获处理handler,以便于在自定义的异常捕获类出现异常时,可以使用原来默认的类进行处理。同时初始化时使用Thread.setDefaultUncaughtExceptionHandler方法来替换原来的异常捕获类。

2、如何存到本地

知道了捕获异常类的使用方法后,接下来看看如何把崩溃信息保存到本地。

想要保存到本地,总体说来分为两步,一是收集设备信息,二是把信息存储到本地。

1)收集设备信息

通过application上下文获取PackageManager,通过PackageManager获取PackageInfo。PI中有版本名称和版本号。同时还可以通过Build.class.getDeclaredFields来反射获取Build信息。而Build类是android系统提供的,携带设备信息。

2)把信息存到本地

SimpleDateFormat类。此类用于标准化一个想要的时间格式,之后通过java.util.Date()方法获取系统时间作为参数生成format版的时间。

Writer,StringWriter,PrintWriter。String缺省使用16bit,PrintWriter用于写入一串16bit数据,跨平台性更好一些。而Throwable提供的printStackTrace方法要求入参是PrintWriter。而PrintWriter类在构造时需要一个Writer作为入参并持有,之后printStackTrace方法底层最终还是调用了PringtWriter持有的Writer类来进行了写入操作。

Writer类有三个关键方法。write,flush和close。

write方法用于写入字符串,此方法调用后,字符串数据保存在缓冲区中,还未写到目标文件中。

flush方法用于刷新缓冲区,将缓冲区数据保存到目标文件中,

close方法用于关闭此流,关闭时会刷新缓冲区。之后在进行刷新或写入会报IO异常。

File的mkdir和mkdirs方法。mkdir只能建一层目录。若是多层目录需要使用mkdirs。

FileOutputStream类,此类用于Android对SD卡的写入操作。入参为全路径的文件名。

使用时和writer一样。

3、崩溃后重启还是关闭应用如何操作

重启还是关闭要看具体需求。

重启的方式是使用PendingIntent与AlarmManager结合来做到延时唤醒APP。因为android系统不允许两个同名进程存在,所以为了成功重启我们的app,需要先杀死原进程。

4、创建的文件如何在android操作页面进行手动删除

还是通过File加路径来找到文件或目录,之后调用deleteAllFiles方法来实现删除。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值