从RxJava的2个observable中获取一个结果

时间:2016-11-23 14:34:14

标签: android rx-java retrofit2 rx-android

我是RxJava的新手,我有一些痛苦要执行我的第一个“艰难的”#39;查询。

我有两个由Retrofit生成的Observable,一个是' ping'一个新的api,另一个是旧的api。第一个将查询' http://myurl.com/newapi/ping',第二个' http://myurl.com/oldapi/ping'。此请求的结果并不重要,我只想知道服务器是使用新API还是旧API。

所以我想同时调用两个observable,最后在最后有一个布尔值,知道我是否使用旧的或新的api。

我尝试了类似的东西

Observable.mergeDelayError(obsOldApi,obsNewApi)
            .observeOn(AndroidSchedulers.mainThread(), true)
            .subscribeOn(Schedulers.io())
            .subscribe(new Subscriber<String>() {
                @Override
                public void onCompleted() {
                }

                @Override
                public void onError(Throwable e) {
                }

                @Override
                public void onNext(String s) {
                }
            });

但onError将被调用一次(我希望只有在两个请求都失败时才调用它)并且当调用onNext时,我不知道它来自哪个请求(旧的或新的api?)。 / p>

谢谢你的帮助

1 个答案:

答案 0 :(得分:3)

为简单起见,假设您已收到关于哪个API可用的"NEW""OLD"

您的操作难度是管理错误:RxJava将错误作为终端状态进行处理。因此,您必须使用.onErrorResumeNext()来忽略此错误。

   Observable<String> theOld = oldApi.map(r -> "OLD")
                                     // ignore errors
                                     .onErrorResumeNext(Obervable.empty());

   Observable<String> theNew = newApi.map(r -> "NEW")
                                     .onErrorResumeNext(Obervable.empty());


   Observable.merge(theOld, theNew)
             .first() // if both api are in errors
             .subscribe(api -> System.out.println("Available API : "+api));

我添加了运算符first:它只需要第一个结果("OLD""NEW"),但如果前一个Observable为空,则会触发错误,这是两种API都不可用的情况。