如何在RxJava2中嵌套两个改装调用?

时间:2018-04-11 08:55:57

标签: android rx-java retrofit retrofit2 rx-android

我有两个可观察者/Zc:forScope-& apiService.getFeed() 我想在同一个屏幕上加载两个数据。为了做到这一点并处理错误,我需要在apiService.getProfile()之后调用apiService.getProfile()

我查了很多例子,但大部分都是使用flatMap&我不确定我们是否可以使用它,特别是因为这两个可观察类型具有不同的类型,并且两者在价值方面都是独立的。

2 个答案:

答案 0 :(得分:1)

这就是我使用Retrofit的{​​{1}}嵌套两个RxJava2来电的方法:

flatMap

但如果它是两种不同的可观察类型,您还可以使用flatMap的不同变体:

  • apiService.getFeed(param1, param2, ...) .flatMap(result -> apiService.getProfile(param1, param2, ...)) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(result -> { //do something here }, throwable -> { view.showErrorMessage(throwable.getMessage()); }); - 返回flatMap
  • Single - 返回flatMapCompletable
  • Completable - 返回flatMapMaybe
  • Maybe - 返回flatMapObservable
  • Observable - 返回flatMapPublisher

答案 1 :(得分:0)

将您的改造响应返回为“可观察”,然后使用zip运算符。 http://reactivex.io/documentation/operators/zip.html

当一个api调用依赖于另一个api调用时,zip运算符是理想的,因为Zip运算符按顺序组合了两个可观察对象的发射。

Observable <String> feed = apiService.getFeed("param");
Observable <String> profile = apiService.getProfile("param");

Observable.zip(
        feed, profile,
        new Func2<String, String, ResultType>() {

           @Override
           public ResultType call(String feedResponse, 
           String profileResponse) {
              // Do something with the feedResponse
              // Do something with the profileResponse
              // Return something with ResultType
              return something;
           }
        }).subscribe(
            //Once requests process are done
           new Consumer<Object>() {
               @Override
               public void accept(Object o) throws Exception {
                   //on successful completion of the request
               }
           },
           new Consumer<Throwable>() {
               @Override
               public void accept(Throwable e) throws Exception {
                   //on error 
               }
           });