让我们从一个基本示例开始,
假设我有以下代码块用于从存储库获取Auth Token
private fun getToken(): LiveData<TokenResponse> {
return LiveDataReactiveStreams.fromPublisher(remoteSource.getAuthToken()
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.map { token -> token }
)
}
我在ViewModel中收到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时,问题就来了。假设我想在收到Token API的结果后调用Search API 。我的目标是为每个步骤获得 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
}
}