2016-11-23 168 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

看起來優雅並且像魅力一樣工作,謝謝! –