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