无法关闭与 Activity 连接的 ViewModel 中的 Realm 实例
Can not close Realm instance in ViewModel connected with Activity
我有一个single activity app并且我有SharedViewModel
附加到它,它的主要目的是用于片段之间的内部通信等. 我还使用 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
的生命周期依赖于activity生命周期的生命周期,所以这个viewModel的onCleared()
方法不会在onDestroy
调用[=之后被调用38=],但是当 activity 完成时。这不是一回事。因此,当我离开我的应用程序时,一个 Realm 连接保持打开状态,因为 activity 不处于 Finished 状态。从片段连接的所有其他视图模型都调用了它们自己的 onCleared()
方法,并且它们的 Realm 连接已关闭。
处理此问题的最佳和最干净的方法是什么?
我有一个解决方法,我在 activity 的 onDestroy
方法中手动调用 viewModel 的 onCleared()
并且它正在工作,但该解决方案是垃圾。
提前致谢!
事实上,@EpicPandaForce 是对的,错误是在 ViewModel 的创建中。我使用 Dagger 2 来注入 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
不绑定到任何 activity 和片段的生命周期。当我将 ViewModel 的创建更改为:
sharedViewModel = ViewModelProviders.of(this).get(SharedViewModel::class.java)
在 activity 的 OnDestroy()
之后,onCleared()
被调用。
谢谢大家!
我有一个single activity app并且我有SharedViewModel
附加到它,它的主要目的是用于片段之间的内部通信等. 我还使用 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
的生命周期依赖于activity生命周期的生命周期,所以这个viewModel的onCleared()
方法不会在onDestroy
调用[=之后被调用38=],但是当 activity 完成时。这不是一回事。因此,当我离开我的应用程序时,一个 Realm 连接保持打开状态,因为 activity 不处于 Finished 状态。从片段连接的所有其他视图模型都调用了它们自己的 onCleared()
方法,并且它们的 Realm 连接已关闭。
处理此问题的最佳和最干净的方法是什么?
我有一个解决方法,我在 activity 的 onDestroy
方法中手动调用 viewModel 的 onCleared()
并且它正在工作,但该解决方案是垃圾。
提前致谢!
事实上,@EpicPandaForce 是对的,错误是在 ViewModel 的创建中。我使用 Dagger 2 来注入 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
不绑定到任何 activity 和片段的生命周期。当我将 ViewModel 的创建更改为:
sharedViewModel = ViewModelProviders.of(this).get(SharedViewModel::class.java)
在 activity 的 OnDestroy()
之后,onCleared()
被调用。
谢谢大家!