旋转片段时使用哪个协程范围?我们可以从视图模型启动协程吗?

Which coroutine scope to use when rotating fragments? Can we launch a coroutine from a viewmodel?

片段中,在通过协程执行保存操作时,应该使用哪种类型的范围主要考虑旋转设备不应停止协程?

我应该在哪里保存协程 Job 引用,以允许用户在执行时随时取消它?即使在旋转之后,如果需要的话?如果我将作业放在 ViewModel 中以便在设备 rotation 之后恢复它,它会泄漏片段的 lifecycleScope 吗?

我知道片段有范围,例如:

fragment.lifecycleScope.launch(context = Dispatchers.IO)

但我不确定这是否正确使用,因为我认为旋转设备可能会取消它。

还有,不知道下一个对不对:

CoroutineScope(Dispatchers.IO)

ViewModel 中,您可以 launch {} 使用 viewmodelscope 的协程,例如"-

viewModelScope.launch {
    // Coroutine that will be canceled when the ViewModel is cleared.
}

然后您可以使用 liveDatafragment 通信,因为 liveData 和 viewmodel 都是生命周期感知的,它也会处理旋转场景。

应该可以解决你的问题。

要使用 viewModelScope,我们需要生命周期版本 2.2.0 及更高版本

// ViewModel
implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.2.0"