我应该将 viewModelScope.coroutineContext 传递给 liveData 构建器函数吗?

Val*_*kov 4 android android-livedata android-viewmodel android-architecture-components kotlin-coroutines

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

如果我在 a 内创建一个LiveDatavia构建器,并观察到,生命周期已经绑定到生命周期。我还应该将其传递给构建者吗?我认为我不应该,但在 Android 文档示例之一中它通过了:liveDataViewModelLiveDataActivityLiveDataActivityviewModelScope.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))
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

Jee*_*ede 5

Q: LiveData生命周期已经和Activity生命周期绑定了。我应该把它交给建筑viewModelScope商吗liveData

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


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

为什么?

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

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

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