gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 13:52:07 28 4
gpt4 key购买 nike

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

即使在我在主 Activity onBackPressed 上显式调用完成并且我可以看到调用了 onDestroy 之后,单例仍在内存中。

我决定在销毁我的 Activity 之前手动清理这些 Singletons,问题是使用 Kotlin 我需要让它们的所有成员变量都可以为空(?)并且记住为每个成员变量赋值会很麻烦变量,所以现在我选择像这样处理 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
}
}

客户端使用:

SingletonName.get().somefunc()

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

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

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

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

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

最佳答案

在 kotlin 中创建单例就像下面一样简单

以下面为例

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

 object MySingleton   {

fun myFunction() {

}
}

并称它为

MySingleton.myFunction()

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

关于android - 在 Android (Kotlin) 中处理单例清理的推荐方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45394540/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com