【发布时间】:2019-04-10 13:20:10
【问题描述】:
我有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()!!)}"}")
}
}
由于SharedViewModel的lyfecycle依赖于activity生命周期的生命周期,这个viewModel的onCleared()方法不会在onDestroyactivity调用之后调用,而是在activity结束时调用。这不是一回事。结果,当我离开我的应用程序时,一个 Realm 连接保持打开状态,因为活动未处于 Finished 状态。从片段连接的所有其他视图模型都调用了它们自己的 onCleared() 方法,并且它们的 Realm 连接已关闭。
处理此问题的最佳和最干净的方法是什么?
我有一个解决方法,我在 onDestroy 活动方法中手动调用 viewModel 的 onCleared() 并且它正在工作,但该解决方案是垃圾。
提前致谢!
【问题讨论】:
-
when I leave my app, one Realm connection stays open, because activity is not in the Finished state.这是您代码中的一个错误,考虑到在您离开应用程序(完成 Activity)时会调用onCleared()。 -
您应该使用共享的
ViewModel在多个片段之间共享实时数据,但对于您的领域连接(领域相关对象),我建议使用单独附加到每个片段的ViewModel。 -
@JeelVankhede,你是对的,但是这个 SharedViewModel 也有一些活动使用的实时数据以及其他片段。
标签: android kotlin realm viewmodel