从RxJava嵌套链内的LiveDataReactiveStreams.fromPublisher()发布多个结果

问题描述 投票:0回答:1

让我们从基本示例开始,

假设我有以下代码块,用于从存储库中获得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
            }
        }

让我们从一个基本示例开始,假设我有以下代码块,用于从存储库私有fun getToken()中获取Auth令牌:LiveData {返回...

android rx-java2 android-livedata android-viewmodel mutablelivedata
1个回答
0
投票

创建一个可以同时包含令牌和搜索结果的包装器类

© www.soinside.com 2019 - 2024. All rights reserved.