我应该将 viewModelScope.coroutineContext 传递给 liveData 构建器函数吗?
Should I pass viewModelScope.coroutineContext to liveData builder function?
viewModelScope is used to bind a coroutine lifetime to the ViewModel
lifecycle. liveData 构建器创建一个运行协程的 LiveData
,其生命周期绑定到 LiveData
状态,因此,当 LiveData
未激活时,协程在超时后取消。由于超时,协程不会在配置更改时取消。
如果我在 ViewModel
中通过 liveData
生成器创建 LiveData
,并观察 Activity
、LiveData
中的 LiveData
生命周期已经绑定到 Activity
生命周期。我是否应该另外将 viewModelScope.coroutineContext
传递给 liveData
构建器?我认为我不应该这样做,但在 Android 文档之一 samples 中它通过了:
class MyViewModel: ViewModel() {
private val userId: LiveData<String> = MutableLiveData()
val user = userId.switchMap { id ->
liveData(context = viewModelScope.coroutineContext + Dispatchers.IO) {
emit(database.loadUserById(id))
}
}
}
问: LiveData
生命周期已经绑定到 Activity
生命周期。我应该将 viewModelScope
传递给 liveData
生成器吗?
在简单的情况下,当一个 Activity 只有一个 ViewModel
时,Activity
生命周期与 ViewModel
生命周期相同,它不应该改变任何东西,无论你是否将 'viewModelScope' 传递给 lifeData
构建器。但是在更复杂的情况下,例如,当片段之间 ViewModel
is shared 时, Fragment
生命周期可能与共享的 ViewModel
生命周期不匹配,在这种情况下启动协程在 'viewModelScope.coroutineContext' 内是有道理的。
因此,您可以使用 viewModelScope
为您的 liveData
构建器提供上下文。
为什么?
According to official doc: A ViewModelScope
is defined for each
ViewModel
in your app. Any coroutine launched in this scope is
automatically canceled if the ViewModel
is cleared.
因此,它有助于 取消您 LiveData
中的当前工作,因为它现在绑定到您的 ViewModelScope
。
此外,如果您正在为布局计算一些数据,viewModelScope
会很有帮助,您应该将工作范围限定在 ViewModel
,这样如果ViewModel
被清除,工作自动取消以避免消耗资源。
viewModelScope is used to bind a coroutine lifetime to the ViewModel
lifecycle. liveData 构建器创建一个运行协程的 LiveData
,其生命周期绑定到 LiveData
状态,因此,当 LiveData
未激活时,协程在超时后取消。由于超时,协程不会在配置更改时取消。
如果我在 ViewModel
中通过 liveData
生成器创建 LiveData
,并观察 Activity
、LiveData
中的 LiveData
生命周期已经绑定到 Activity
生命周期。我是否应该另外将 viewModelScope.coroutineContext
传递给 liveData
构建器?我认为我不应该这样做,但在 Android 文档之一 samples 中它通过了:
class MyViewModel: ViewModel() {
private val userId: LiveData<String> = MutableLiveData()
val user = userId.switchMap { id ->
liveData(context = viewModelScope.coroutineContext + Dispatchers.IO) {
emit(database.loadUserById(id))
}
}
}
问: LiveData
生命周期已经绑定到 Activity
生命周期。我应该将 viewModelScope
传递给 liveData
生成器吗?
在简单的情况下,当一个 Activity 只有一个 ViewModel
时,Activity
生命周期与 ViewModel
生命周期相同,它不应该改变任何东西,无论你是否将 'viewModelScope' 传递给 lifeData
构建器。但是在更复杂的情况下,例如,当片段之间 ViewModel
is shared 时, Fragment
生命周期可能与共享的 ViewModel
生命周期不匹配,在这种情况下启动协程在 'viewModelScope.coroutineContext' 内是有道理的。
因此,您可以使用 viewModelScope
为您的 liveData
构建器提供上下文。
为什么?
According to official doc: A
ViewModelScope
is defined for eachViewModel
in your app. Any coroutine launched in this scope is automatically canceled if theViewModel
is cleared.
因此,它有助于 取消您 LiveData
中的当前工作,因为它现在绑定到您的 ViewModelScope
。
此外,如果您正在为布局计算一些数据,viewModelScope
会很有帮助,您应该将工作范围限定在 ViewModel
,这样如果ViewModel
被清除,工作自动取消以避免消耗资源。