我应该将 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,并观察 ActivityLiveData 中的 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被清除,工作自动取消以避免消耗资源。