Android应用在很多时候会因为不同的原因造成闪退的现象,在开发的过程中不会没处地方都做到try一下,但当用户闪出现后,开发人员并不清楚触发异常的问题所在,所以需要我们进行全局捕获异常。
实现
创建一个方法类继承Thread.UncaughtExceptionHandler重写uncaughtException
class GlobalExceptionHandler(context: Context) : Thread.UncaughtExceptionHandler {
private val mContext = context
override fun uncaughtException(t: Thread, e: Throwable) {
e.printStackTrace()
//获取异常信息
val stackTrace = e.cause?.stackTrace
var errMessage = if (!stackTrace.isNullOrEmpty()){
"${e.cause?.message}\n${e.localizedMessage}\nfile:${stackTrace[0].fileName}\nmethod:${stackTrace[0].methodName} Line:${stackTrace[0].lineNumber}"
}else{
"${e.cause?.message}\n${e.localizedMessage}"
}
//异常信息写到操作日志中(这里是我自己将异常的信息保存到手机本地中,这里可以改成调用后台接口,将异常信息直接发送到后台去)
LogFileUtils.OperationLog("未捕获异常:$errMessage")
//跳转到一个新的Activity报异常信息弹窗
val intent = Intent(mContext,ErrorShowActivity::class.java)
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
intent.putExtra("errMessage",errMessage)
mContext.startActivity(intent)
}
}
最后在BaseApplication的onCreate中进行调用
Thread.setDefaultUncaughtExceptionHandler(GlobalExceptionHandler(applicationContext))
这样如果当应用出现异常,而没有再那段代码中进行try...catch...的时候,能够捕获到该异常信息,如果不做Activity的跳转事件,应用还是会闪退,并不是阻止了闪退,而是捕获异常事件,捕获之后能够根据自己的设计对后续事件进行处理(重启应用...)。