在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