gpt4 book ai didi

android - 无法关闭与 Activity 连接的 ViewModel 中的 Realm 实例

转载 作者:行者123 更新时间:2023-11-29 00:54:42 25 4
gpt4 key购买 nike

我有single activity app,我有SharedViewModel 附加到它,它的主要目的是用于 fragment 之间的内部通信等。我也使用Realm 作为存储解决方案。这个 viewModel 以及其他 viewModel 扩展了 BaseViewModel。

open class BaseViewModel(): ViewModel() {

val realm: Realm = Realm.getDefaultInstance()

override fun onCleared() {
super.onCleared()
realm.close()
Log.d("BVM", "realm is ${ if (realm.isClosed) "closed." else "not closed. Opened connections: ${Realm.getLocalInstanceCount(Realm.getDefaultConfiguration()!!)}"}")
}
}

这张图我们都很熟悉enter image description here

由于 SharedViewModel 的生命周期依赖于 Activity 生命周期的生命周期,因此该 viewModel 的 onCleared() 方法将不会在 onDestroy 调用之后被调用 Activity ,但是当 Activity 结束时。这不是一回事。因此,当我离开我的应用程序时,一个 Realm 连接保持打开状态,因为 Activity 未处于 Finished 状态。从 fragment 连接的所有其他 View 模型都调用了它们自己的 onCleared() 方法,并且它们的 Realm 连接已关闭。

处理这个问题的最好和最干净的方法是什么?

我有一个解决方法,我在 Activity 的 onDestroy 方法中手动调用 viewModel 的 onCleared() 并且它正在工作,但该解决方案是垃圾。

提前致谢!

最佳答案

事实上,@EpicPandaForce 是对的,错误出在 ViewModel 的创建中。我使用 Dagger 2 注入(inject) ViewModelFactory,如下所示:

@Singleton
class ViewModelFactory @Inject constructor(
private val creators: Map<Class<out ViewModel>, @JvmSuppressWildcards Provider<ViewModel>>
) : ViewModelProvider.Factory {
override fun <T : ViewModel> create(modelClass: Class<T>): T {
val creator = creators[modelClass] ?: creators.entries.firstOrNull {
modelClass.isAssignableFrom(it.key)
}?.value ?: throw IllegalArgumentException("unknown model class $modelClass")
try {
@Suppress("UNCHECKED_CAST")
return creator.get() as T
} catch (e: Exception) {
throw RuntimeException(e)
}
}
}
此工厂提供的

ViewModel 不绑定(bind)到任何 Activity 和 fragment 的生命周期。当我将 ViewModel 的创建更改为:

sharedViewModel = ViewModelProviders.of(this).get(SharedViewModel::class.java)

OnDestroy() Activity 之后,调用 onCleared()

谢谢大家!

关于android - 无法关闭与 Activity 连接的 ViewModel 中的 Realm 实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55613645/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com