Ped*_*MVU 5 singleton android kotlin
当我通过后退键关闭并重新输入时,我的 Android 应用程序中遇到了一些奇怪的问题,并发现它们的发生是因为我从未重新初始化过 2 个 Singleton 类中的变量(如果手动终止应用程序,则不会发生该问题)来自任务管理器)。
即使我在主活动 onBackPressed 上显式调用 finish 并且我可以看到 onDestroy 被调用后,单例仍然在内存中。
我决定在销毁我的 Activity 之前手动清理这些单例,问题是使用 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
}
}
Run Code Online (Sandbox Code Playgroud)
客户端使用:
SingletonName.get().somefunc()
Run Code Online (Sandbox Code Playgroud)
这些似乎比应有的更复杂,而且我知道这甚至不是线程安全的,但请记住,简单地使用“object”关键字而不是“class”是行不通的,因为它会阻止第二次发生任何初始化我运行应用程序(构造函数不会再次被调用,我无法强制销毁实例)。
这让我觉得可能值得研究一下 Android 依赖注入,但我觉得至少我的一个单例确实需要在很多地方访问,所以它可能也不是一个优雅的解决方案(可能需要将其重构为更小的功能)。
这里的主要问题是 android 处理销毁的方式,但我想我无法改变它,如果应用程序活动已经被销毁,我看不出为什么它会保留非活动类的所有静态值。
问题是无论使用何种语言,您如何处理这种情况?或者您认为这种情况下的最佳做法是什么?
编辑:实际上我刚刚用 Dagger 2 做了一个测试,并且发生了同样的问题,如果我使用 @Provides 和 @Singleton,第二次启动应用程序时提供的对象上的成员变量的值不为空,所以我想这需要除非我缺少更多注释来告诉 Dagger 该实例应该在应用程序生命周期结束时释放,否则要明确处理。
在 kotlin 中创建 Singleton 非常简单,如下所示
以下面为例
无需显式创建类,只需执行以下操作
object MySingleton {
fun myFunction() {
}
}
Run Code Online (Sandbox Code Playgroud)
并称其为
MySingleton.myFunction()
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3359 次 |
| 最近记录: |