在Android程序运行时,如果有任何一个线程抛出了未被截获的异常(也就是未被try...catch盖住), 那么该异常最终会抛给Thread.UncaughtExceptionHandler
处理,并且该线程会消亡
如果主线程出现了未捕获异常,则主线程会在将异常抛给Thread.UncaughtExceptionHandler
处理后死亡,就会导致ANR,给用户的体验极其不好,通过实现Thread.UncaughtExceptionHandler
则可以在程序出现ANR时做出想要执行的操作
自定义 Thread.UncaughtExceptionHandler
首先创建自己的Application
class WeatherApplication : Application() {
// 单例
companion object {
fun getInstance(): WeatherApplication = Inner.instance
}
private object Inner {
lateinit var instance: WeatherApplication
}
override fun onCreate() {
super.onCreate()
Inner.instance = this
}
/**
* 重启应用
*/
fun restartApp() {
Inner.instance.startActivity(
Inner.instance.packageManager.getLaunchIntentForPackage(Inner.instance.packageName)
)
// 干掉当前的程序
Process.killProcess(Process.myPid())
}
}
别忘了在AndroidManifest.xml
中注册Application
android:name=".WeatherApplication"
然后创建自己的未捕获异常处理类
object CrashHandler: Thread.UncaughtExceptionHandler {
override fun uncaughtException(t: Thread, e: Throwable) {
// 抛出提示
// 记录错误
// 重启app
WeatherApplication.getInstance().restartApp()
}
}
将创建好的异常处理类在Application的onCreate
中设置为默认的未捕获异常处理类
override fun onCreate() {
super.onCreate()
// 设置未捕获异常处理类
Thread.setDefaultUncaughtExceptionHandler(CrashHandler)
}
网友评论