Android 关闭片段并使用ViewModelScope时房间插入丢失

Android 关闭片段并使用ViewModelScope时房间插入丢失,android,android-fragments,kotlin,android-room,android-viewmodel,Android,Android Fragments,Kotlin,Android Room,Android Viewmodel,我已经遵循了,但已将其更改为具有多个片段的单个活动应用程序。我有一个用于插入记录的片段。save按钮调用viewmodel保存方法,然后弹出backbackback以返回到上一个(列表)片段。有时这是可行的,但通常不会插入。我假设这是因为一旦片段被销毁,ViewModelScope将取消任何挂起的操作,因此如果插入操作尚未发生,那么它将丢失 片段: private val wordViewModel: WordViewModel by viewModel ... private fun sa

我已经遵循了,但已将其更改为具有多个片段的单个活动应用程序。我有一个用于插入记录的片段。save按钮调用viewmodel保存方法,然后弹出backbackback以返回到上一个(列表)片段。有时这是可行的,但通常不会插入。我假设这是因为一旦片段被销毁,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)
}
视图模型:

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)
}
存储库:

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,因为我从不希望插入失败?如果是这样,这应该放在片段还是视图模型中?

一个选项是添加到插入的上下文中:

fun save(word: Word) = viewModelScope.launch(Dispatchers.IO + NonCancellable) {
    repository.insert(word)
}
中推荐和概述的方法是创建自己的应用程序级作用域并在其中运行不可取消的操作。

一个选项是添加到插入的上下文中:

fun save(word: Word) = viewModelScope.launch(Dispatchers.IO + NonCancellable) {
    repository.insert(word)
}
中推荐和概述的方法是创建自己的应用程序级别作用域,并在其中运行不可取消的操作