首页 > 解决方案 > 如何使用 rxJava2 在一个请求中发出两个请求

问题描述

我正在我的 Android 应用程序中访问服务器。我想获取我的朋友列表和不同查询中的朋友请求列表。他们必须同时来。然后我想在屏幕上显示这些数据。

我尝试使用 flatMap 从两个查询中获取数据。 interactor.getColleagues()interactor.getTest()返回数据类型Observable<List<Colleagues>>

private fun loadColleaguesEmployer() {
        if (disposable?.isDisposed == true) disposable?.dispose()
        //запрос на список друзей
        interactor.getColleagues(view.getIdUser() ?: preferences.userId)
            .subscribeOn(Schedulers.io())
            .flatMap {
                interactor.getTest().subscribeOn(Schedulers.io())
                    .doOnNext {
                            result-> view.showTest(mapper.map(result))
                    }
            }
            .observeOn(AndroidSchedulers.mainThread())
            .subscribeBy(
                onNext = { result1 ->
                    //Обработка списка коллег работодателей
                    view.showColleagues(mapper.map(result1.filter { data -> data.typeFriend == "Работодатель" }))
                },
                onError = { it.printStackTrace() }
            )
    }

我想同时获取和处理来自不同查询的数据。

标签: androidkotlinrx-java2

解决方案


Zip 通过指定的函数将多个 Observable 的发射组合在一起

您可以使用Zip (rx Java) http://reactivex.io/documentation/operators/zip.html,一些 sudo 代码将是这样的 -

val firstApiObserver = apIs.hitFirstApiFunction(//api parameters)
val secondApiObserver = apIs.hitSecondApiFunction(//api parameters)

val zip: Single<SubscriptionsZipper>//SubscriptionsZipper is the main model which contains first& second api response model ,
zip = Single.zip(firstApiObserver, secondApiObserver, BiFunction { firstApiResponseModel,secondApiResponseModel -> SubscriptionsZipper(firstApiResponseModelObjectInstance, secondApiResponseModelObjectInstance) })

zip.observeOn(AndroidSchedulers.mainThread())
        .subscribeOn(Schedulers.io())
        .subscribe(object : SingleObserver<SubscriptionsZipper> {
            override fun onSubscribe(d: Disposable) {
                compositeDisposable.add(d)
            }

            override fun onSuccess(subscriptionsZipper: SubscriptionsZipper) {
                Utils.hideProgressDialog()
               //here you will get both api response together
            }

            override fun onError(e: Throwable) {
                Utils.hideProgressDialog()
            }
        })

希望对你有帮助。


推荐阅读