我的Android应用程序在通过后退键重新关闭时发现了一些奇怪的问题,并发现它们正在发生,因为我所拥有的2个Singleton类中的变量永远不会重新初始化(问题不会发生)如果从任务管理器手动终止应用程序)。
即使我在主要活动onBackPressed上显式调用完成后我看到onDestroy被调用,但是Singletons仍在内存中。
我决定在销毁我的Activity之前手动清理这些Singletons,问题是使用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
}
}
客户使用:
SingletonName.get().somefunc()
这些似乎比它应该更多涉及,我知道这甚至不是线程安全的,但请记住,只需使用'对象'关键字而不是' class'将无法正常工作,因为它会阻止我第二次运行应用程序时发生的任何初始化(构造函数不再被调用,我不能强制销毁实例)。
这让我觉得可能值得研究Android依赖注入,但我觉得至少有一个我的Singletons确实需要在很多地方访问,所以它可能也不是一个优雅的解决方案(可能需要重构)它变成了更小的功能。)
这里的主要问题是android处理破坏的方式,但我想我无法改变它,如果应用程序活动是,我不会看到为什么它保留非活动类的所有静态值的任何原因已经被摧毁了。
问题是,无论使用何种语言,您如何处理此案件?或者您认为这种情况下的最佳做法是什么?
编辑:其实我只是用Dagger 2进行了测试,同样的问题发生了,如果我使用@Provides和@Singleton,第二次启动应用程序时提供的对象上的成员变量值不为null所以我猜测这需要明确处理,除非我缺少一些注释来告诉Dagger实例应该在应用程序生命周期结束时释放。
答案 0 :(得分:1)
在kotlin中创建Singleton就像跟随
一样简单以下面为例
无需显式创建类,只需执行以下操作
object MySingleton {
fun myFunction() {
}
}
并称之为
MySingleton.myFunction()
您从其文档https://kotlinlang.org/docs/reference/object-declarations.html#object-declarations
中了解了有关kotlin中单身人士的更多信息