Android 全局异常处理

作者: 枫未晚 | 来源:发表于2022-03-25 08:05 被阅读0次

在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)
}

相关文章

网友评论

    本文标题:Android 全局异常处理

    本文链接:https://www.haomeiwen.com/subject/ihhljrtx.html