关闭片段和使用 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 中推荐和概述的方法是创建您自己的应用程序级范围和 运行 您在其中的不可取消操作。