关闭片段和使用 ViewModelScope 时房间插入丢失
Room insert lost when closing fragment and using ViewModelScope
我已关注 Android Room with a View tutorial,但已将其更改为包含多个片段的单一 activity 应用程序。我有一个用于插入记录的片段。保存按钮调用视图模型保存方法,然后将返回堆栈弹出到 return 到上一个(列表)片段。有时这可行,但通常不会发生插入。我认为这是因为一旦片段被销毁,ViewModelScope 就会取消所有未决操作,因此如果插入尚未发生,它就会丢失。
片段:
private val wordViewModel: WordViewModel by viewModel
...
private fun saveAndClose() {
wordViewModel.save(word)
getSupportFragmentManager().popBackStack()
}
视图模型:
fun save(word: Word) = viewModelScope.launch(Dispatchers.IO) {
repository.insert(word)
}
存储库:
suspend fun insert(word: Word) {
wordDao.insert(word)
}
我该如何解决这个问题?我应该使用 GlobalScope 而不是 ViewModelScope 因为我不想插入失败吗?如果是这样,它应该放在片段还是视图模型中?
一种选择是将 NonCancellable 添加到插入的上下文中:
fun save(word: Word) = viewModelScope.launch(Dispatchers.IO + NonCancellable) {
repository.insert(word)
}
this post 中推荐和概述的方法是创建您自己的应用程序级范围和 运行 您在其中的不可取消操作。
我已关注 Android Room with a View tutorial,但已将其更改为包含多个片段的单一 activity 应用程序。我有一个用于插入记录的片段。保存按钮调用视图模型保存方法,然后将返回堆栈弹出到 return 到上一个(列表)片段。有时这可行,但通常不会发生插入。我认为这是因为一旦片段被销毁,ViewModelScope 就会取消所有未决操作,因此如果插入尚未发生,它就会丢失。
片段:
private val wordViewModel: WordViewModel by viewModel
...
private fun saveAndClose() {
wordViewModel.save(word)
getSupportFragmentManager().popBackStack()
}
视图模型:
fun save(word: Word) = viewModelScope.launch(Dispatchers.IO) {
repository.insert(word)
}
存储库:
suspend fun insert(word: Word) {
wordDao.insert(word)
}
我该如何解决这个问题?我应该使用 GlobalScope 而不是 ViewModelScope 因为我不想插入失败吗?如果是这样,它应该放在片段还是视图模型中?
一种选择是将 NonCancellable 添加到插入的上下文中:
fun save(word: Word) = viewModelScope.launch(Dispatchers.IO + NonCancellable) {
repository.insert(word)
}
this post 中推荐和概述的方法是创建您自己的应用程序级范围和 运行 您在其中的不可取消操作。