在 Android (Kotlin) 中处理单例清理的推荐方法是什么?

Ped*_*MVU 5 singleton android kotlin

当我通过后退键关闭并重新输入时,我的 Android 应用程序中遇到了一些奇怪的问题,并发现它们的发生是因为我从未重新初始化过 2 个 Singleton 类中的变量(如果手动终止应用程序,则不会发生该问题)来自任务管理器)。

即使我在主活动 onBackPressed 上显式调用 finish 并且我可以看到 onDestroy 被调用后,单例仍然在内存中。

我决定在销毁我的 Activity 之前手动清理这些单例,问题是使用 Kotlin 我需要将它们的所有成员变量设为可为空(?),并且记住为每个变量分配 null 会很麻烦,所以现在我选择像这样处理 Singleton 的实例化,并在清理时将整个实例设置为 null:

class SingletonName {

    companion object {
        private var _instance: SingletonName ? = null
        private var instance: SingletonName ?
            get() {
                if (_instance == null) {
                    _instance = SingletonName ()
                }
                return _instance
            }
            set(value) {
                _instance = value
            }

        @JvmStatic fun get(): SingletonName {
            return instance!! //avoid having to deal with nullable value in client code
        }
    }

    //need to make sure to call this before destroying main activity
    fun cleanup() {
        instance = null
    }
}
Run Code Online (Sandbox Code Playgroud)

客户端使用:

SingletonName.get().somefunc()
Run Code Online (Sandbox Code Playgroud)

这些似乎比应有的更复杂,而且我知道这甚至不是线程安全的,但请记住,简单地使用“object”关键字而不是“class”是行不通的,因为它会阻止第二次发生任何初始化我运行应用程序(构造函数不会再次被调用,我无法强制销毁实例)。

这让我觉得可能值得研究一下 Android 依赖注入,但我觉得至少我的一个单例确实需要在很多地方访问,所以它可能也不是一个优雅的解决方案(可能需要将其重构为更小的功能)。

这里的主要问题是 android 处理销毁的方式,但我想我无法改变它,如果应用程序活动已经被销毁,我看不出为什么它会保留非活动类的所有静态值。

问题是无论使用何种语言,您如何处理这种情况?或者您认为这种情况下的最佳做法是什么?

编辑:实际上我刚刚用 Dagger 2 做了一个测试,并且发生了同样的问题,如果我使用 @Provides 和 @Singleton,第二次启动应用程序时提供的对象上的成员变量的值不为空,所以我想这需要除非我缺少更多注释来告诉 Dagger 该实例应该在应用程序生命周期结束时释放,否则要明确处理。

v4_*_*adi 1

在 kotlin 中创建 Singleton 非常简单,如下所示

以下面为例

无需显式创建类,只需执行以下操作

 object MySingleton   {

      fun myFunction() {

        }
    }
Run Code Online (Sandbox Code Playgroud)

并称其为

MySingleton.myFunction()
Run Code Online (Sandbox Code Playgroud)

您可以从其文档https://kotlinlang.org/docs/reference/object-declarations.html#object-declarations中了解有关 kotlin 中单例的更多信息