让我们从基本示例开始,
假设我有以下代码块,用于从存储库中获得Auth Token
private fun getToken(): LiveData<TokenResponse> {
return LiveDataReactiveStreams.fromPublisher(remoteSource.getAuthToken()
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.map { token -> token }
)
}
我在ViewModel中收到LiveData结果
时,问题就来了。假设我要从Token API接收结果后调用Search API。我的目标是为每个步骤获得2个LiveData事件更改。下面显示了修改后的代码以演示我的要求,class HomeModel { private var tokenLiveDataSource: MediatorLiveData<TokenResponse> = MediatorLiveData() private var tokenLiveData: MutableLiveData<TokenResponse> = MutableLiveData() fun observeTokenLiveData(): LiveData<TokenResponse> { return tokenLiveData } fun getToken() { val source = repository.getToken() tokenLiveDataSource.addSource(source) { tokenLiveData.value = it tokenLiveDataSource.removeSource(source) } } }
至此,一切正常,但例外。但是,当我想将2个请求合并在一起并为每个请求分别获取LiveData
private fun getSearchResult(): LiveData<?> { return LiveDataReactiveStreams.fromPublisher(remoteSource.getAuthToken() // 1ST API CALL .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .map { token -> // NOTIFY THE 1ST API RESULT/RETURN LiveData<TokenResponse> token } .flatMap { token -> remoteSource.getSearchResult(token) // 2ND API CALL } .map { results -> // NOTIFY THE 2ND API RESULT/RETURN LiveData<SearchResult> results } ) }
如何从给定的示例中接收2个LiveData?
class HomeModel {
private var tokenLiveDataSource: MediatorLiveData<TokenResponse> = MediatorLiveData()
private var tokenLiveData: MutableLiveData<TokenResponse> = MutableLiveData()
private var searchLiveDataSource: MediatorLiveData<SearchResponse> = MediatorLiveData()
private var searchLiveData: MutableLiveData<SearchResponse> = MutableLiveData()
fun observeTokenLiveData(): LiveData<TokenResponse> {
return tokenLiveData
}
fun observeSearchLiveData(): LiveData<SearchResponse> {
return searchLiveData
}
fun getSearchResult() {
// RECEIVE 2 LiveData HERE
}
}
让我们从一个基本示例开始,假设我有以下代码块,用于从存储库私有fun getToken()中获取Auth令牌:LiveData
创建一个可以同时包含令牌和搜索结果的包装器类