2016-11-23 130 views
1

我是RxJava的新手,我有些难以执行我的第一个'困难'查询。从RxJava获得2个观察结果中的一个结果

我有两个从Retrofit生成的Observable,一个'ping'一个新的API,另一个是旧的。第一个将询问'http://myurl.com/newapi/ping',第二个'http://myurl.com/oldapi/ping'。这个请求的结果并不重要,我只想知道服务器是使用新的还是旧的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?)。

谢谢你的帮助

+0

您可以使用'onErrorResume',但这意味着只有在另一个失败的情况下调用一个API – njzk2

回答

2

为了简单起见,我们说,你会收到"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是unavaible触发一个错误。

+0

看起来优雅并且像魅力一样工作,谢谢! –