在Android(Kotlin)中处理Singletons清理的推荐方式是什么?
当我通过后退键并重新输入时,我的Android应用程序出现了一些奇怪的问题,并且发现它们正在发生,因为我有2个Singleton类中的变量永远不会重新初始化(如果手动查杀,问题不会发生来自任务管理器的应用程序)。在Android(Kotlin)中处理Singletons清理的推荐方式是什么?
即使我明确地完成主要活动onBackPressed并且我可以看到onDestroy被调用后,Singleton仍然在内存中。
我决定在破坏我的Activity之前手动清理这些单例,问题是使用Kotlin我需要使它们的所有成员变量都为空(?),并且记住将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依赖注入,但我觉得至少有一个单身真的需要在很多地方访问,所以它可能不是一个优雅的解决方案要么(可能需要将其重构为更小的功能)。
这里的主要问题是android处理破坏的方式,但我想我不能改变这种情况,如果应用程序活动已经被破坏,我没有看到任何理由为什么它保留非活动类的所有静态值。
问题是如何处理这种情况,无论使用何种语言?或者您认为这种情况下的最佳做法是什么?
编辑:其实我只是用Dagger 2做了一个测试,并且发生同样的问题,如果我使用@Provides和@Singleton,第二次启动应用程序时提供的对象上的成员变量的值不为null我想这需要明确处理,除非我缺少一些更多注释来告诉Dagger实例应该在应用程序生命周期结束时发布。
在科特林创建辛格尔顿是如下
采取以下作为一个例子
无需明确创建的类一样简单,只要做到以下
object MySingleton {
fun myFunction() {
}
}
,并调用它像
MySingleton.myFunction()
你读了更多关于kotlin f中的单身人士ROM的文档https://kotlinlang.org/docs/reference/object-declarations.html#object-declarations
你可以像'recreate'或东西的方法来重新初始化单 – Mibac
整个方法看起来很奇怪。如果只有在Activity可见时才需要这个“singleton”,那么只需在Activity中创建一个对象即可。 –
@ Miha_x*情是我需要整个应用程序的整个生命周期的单身人士,是的,我想在开始时重新创建将与最后清理相同,但问题是一样的,需要确保重置每个成员变量。 – PedroMVU