旋转片段时使用哪个协程范围?我们可以从视图模型启动协程吗?
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.
}
然后您可以使用 liveData
与 fragment
通信,因为 liveData 和 viewmodel 都是生命周期感知的,它也会处理旋转场景。
应该可以解决你的问题。
要使用 viewModelScope
,我们需要生命周期版本 2.2.0
及更高版本
// ViewModel
implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.2.0"
片段中,在通过协程执行保存操作时,应该使用哪种类型的范围主要考虑旋转设备不应停止协程?
我应该在哪里保存协程 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.
}
然后您可以使用 liveData
与 fragment
通信,因为 liveData 和 viewmodel 都是生命周期感知的,它也会处理旋转场景。
应该可以解决你的问题。
要使用 viewModelScope
,我们需要生命周期版本 2.2.0
及更高版本
// ViewModel
implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.2.0"