我正在尝试使用livedata
构建器函数。确实,它是如此易于使用,但实际上我不明白如何重新启动协程。在我下面的代码部分:
val topStoriesResult : LiveData<UIState<TopStoryWrapper>> = liveData(Dispatchers.IO) {
topStoriesRepository.getTopStoriesSetWrapper().apply {
emit(UIState.Loading)
onFailure { emit(UIState.NoData) }
onSuccess { emit(UIState.HasData(it)) }
}
}
[liveData
构建器无法重新启动,docs说:
liveData
构建块用作协程和LiveData
之间的结构化并发原语。当LiveData
变为活动状态时,代码块开始执行;当LiveData
变为非活动状态时,经过可配置的超时后,代码块自动取消。如果在完成前将其取消,则LiveData
再次变为活动状态时,它将重新启动。 如果它在先前的运行中成功完成,则不会重新启动。请注意,只有自动取消后,它才会重新启动。如果该块由于其他任何原因而被取消(例如引发CancellationException),则不会重新启动。
为了使代码运行几次,我建议您创建一个函数并在需要时调用它,例如在按钮上单击:
class MainViewModel : ViewModel() {
val topStoriesResult: LiveData<UIState<TopStoryWrapper>> = MutableLiveData<LiveData<UIState<TopStoryWrapper>>>()
fun loadTopStories() = viewModelScope.launch(Dispatchers.IO) { // start a coroutine
topStoriesRepository.getTopStoriesSetWrapper().apply {
val mutableLiveData = loginResponse as MutableLiveData
// post value to LiveData
mutableLiveData.postValue(UIState.Loading)
onFailure { mutableLiveData.postValue(UIState.NoData) }
onSuccess { mutableLiveData.postValue(UIState.HasData(it)) }
}
}
}
要在viewModelScope
类中使用MainViewModel
,请向build.gradle文件添加依赖项:
final LIFECYCLE_VERSION =“ 2.2.0-rc03” //添加最新版本
api“ androidx.lifecycle:lifecycle-viewmodel-ktx:$ LIFECYCLE_VERSION”