使用 RxJava 从 2 个可观察对象中获取一个结果

Get one result from 2 observables with RxJava

我是 RxJava 的新手,执行第一个 'difficult' 查询时有些痛苦。

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

所以我想同时调用两个 observables,最后有一个布尔值来知道我使用的是旧的还是新的 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 ?).

谢谢你的帮助

为简单起见,假设您将收到 "NEW""OLD",其中 api 可用。

您操作的难点在于管理错误: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 都不可用,就是这种情况。