【发布时间】:2019-07-22 16:45:21
【问题描述】:
viewModelScope 用于将协程生命周期绑定到 ViewModel 生命周期。 liveData 构建器创建一个运行协程的 LiveData,其生命周期绑定到 LiveData 状态,因此,当 LiveData 不活动时,协程在超时后取消。由于超时,协程不会在配置更改时取消。
如果我通过liveData 在ViewModel 中创建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))
}
}
}
【问题讨论】:
-
似乎只能将实时数据传递给处于“STARTED”或“RESUMED”状态的LifecycleOwner。因此,在
viewModelScope中运行 couroutine 时,如果观察者在这些状态之外,则可能不会收到发出的数据。 -
您是否打算使用
viewModelScope?你的问题有点复杂。为什么不使用 LiveData 范围 (lifecycle-livedata-ktx) -
你将如何触发用户
liveData?
标签: android android-architecture-components android-livedata android-viewmodel kotlin-coroutines