基本的なサンプルから始めましょう。
リポジトリから認証トークンを取得するための次のコード ブロックがあるとします。
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
}
}