在Android(Kotlin)中处理Singletons清理的建议方法是什么?

我一直在我的Android应用程序关闭时通过回车键并重新进入一些奇怪的问题,并发现他们正在发生,因为2个单身类中的variables我永远不会重新初始化(问题不会发生,如果手动杀死应用程序来自任务管理器)。

即使我明确地调用完onBackPressed的Main活动,我可以看到onDestroy被调用后,单例仍然在内存中。

我决定在破坏我的Activity之前对这些Singleton进行手动清理,问题是使用Kotlin我需要使所有成员variables为空(?),并且记住将null分配给每个variables都是很麻烦的,所以现在我选择像这样处理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”将不起作用,因为它会阻止第二次发生任何初始化我运行应用程序(构造函数不被再次调用,我不能强制销毁实例)。

这使我认为这可能是值得研究Androiddependency injection,但我觉得至少有一个我的单身真的需要在很多地方访问,所以它可能不是一个优雅的解决方案要么(可能需要将其重构成较小function)。

这里的主要问题是Android处理破坏的方式,但我想我不能改变这一点,我没有看到任何理由,如果应用程序活动已经被破坏,它保持非活动类的所有静态值。

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

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

在kotlin中创建单例如下所示

以下面为例

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

  object MySingleton { fun myFunction() { } } 

并称之为

 MySingleton.myFunction() 

你可以阅读更多关于kotlin中单例的文章https://kotlinlang.org/docs/reference/object-declarations.html#object-declarations

Interesting Posts