Mathieu H.
Mathieu H.

Reputation: 880

Get one result from 2 observables with RxJava

I am new at RxJava and I have some pain to execute my first 'difficult' query.

I have two Observables generated from Retrofit, one that 'ping' a new api, the other the old one. The first one will query 'http://myurl.com/newapi/ping', the second one 'http://myurl.com/oldapi/ping'. Result from this request doesn't matter, I just want to know if the server is using the new or old api.

So I would like to call both observables at the same time, and finally have a boolean at the end to know if I'm using old or new api.

I tried something like that

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) {
                }
            });

But onError will be called once (I would like it to be called only if both request failed) and when onNext is called, I don't know from which request it came (old or new api ?).

Thank you for you help

Upvotes: 3

Views: 466

Answers (1)

dwursteisen
dwursteisen

Reputation: 11515

For simplicity, let say that you'll received "NEW" or "OLD" regarding which api is available.

The difficulty of your operation is to manage errors : RxJava deals errors as terminal state. So you'll have to ignore this error, using .onErrorResumeNext() for example.

   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));

I added the operator first : it will take only the first result ("OLD" or "NEW") but trigger an error if the previous Observable is empty, which is the case if both API are unavaible.

Upvotes: 3

Related Questions