首页 > 解决方案 > 我应该将 viewModelScope.coroutineContext 传递给 liveData 构建器函数吗?

问题描述

viewModelScope用于将协程生命周期绑定到ViewModel生命周期。liveData构建器创建一个LiveData运行协程,其生命周期绑定到LiveData状态,因此,当LiveData它不活动时,协程在超时后取消。由于超时,协程不会在配置更改时被取消。

如果我在 a 中创建一个LiveDatavialiveData构建器,并在 中ViewModel观察到,生命周期已经绑定到生命周期。我是否应该另外将其传递给构建器?我认为我不应该这样做,但在其中一个 Android 文档示例中它通过了:LiveDataActivityLiveDataActivityviewModelScope.coroutineContextliveData

class MyViewModel: ViewModel() {
    private val userId: LiveData<String> = MutableLiveData()
    val user = userId.switchMap { id ->
        liveData(context = viewModelScope.coroutineContext + Dispatchers.IO) {
            emit(database.loadUserById(id))
        }
    }
}

标签: androidandroid-architecture-componentsandroid-livedataandroid-viewmodelkotlin-coroutines

解决方案


问: LiveData生命周期已经绑定到Activity生命周期。我应该把它传递viewModelScopeliveData建造者吗?

在简单的情况下,当一个 Activity 只有一个ViewModel时,Activity生命周期与生命周期相同ViewModel,并且它不应该改变任何东西,无论你是否将 'viewModelScope' 传递给lifeData构建器。但在更复杂的情况下,例如,当片段之间ViewModel 共享Fragment时,生命周期可能与共享的生命周期不匹配ViewModel,在这种情况下,在“viewModelScope.coroutineContext”中启动协程是有意义的。


因此,您可以使用viewModelScope为您的liveData构建器提供上下文。

为什么?

根据官方文档在您的应用程序中ViewModelScope为每个定义了 A。如果清除,则在此范围内启动的ViewModel任何协程都会自动取消。ViewModel

因此,它有助于取消您当前的工作,LiveData因为它现在已绑定到您的ViewModelScope.

此外,viewModelScope如果您正在为布局计算一些数据ViewModel,这很有帮助,您应该将工作范围限定为这样,如果ViewModel清除了,工作会自动取消以避免消耗资源。


推荐阅读