2016-05-10 20 views
1

Mein Anwendungsfall ist: Ich habe eine Android-App, ich muss eine API anrufen, wenn diese Daten verfügbar sind rufen Sie die zweite API. Dafür hatte ich vor, RxAndroid mit Wiederholungen zu verwenden.Kette 2 Anrufe mit Wiederholung mit RxAndroid

Ich konnte 1 API-Anruf mit Wiederholungen, aber ich muss die 2 Kette, und in der Lage sein, 2 verschiedene Fehler, eine für Anruf 1 nicht verfügbar, und eine für Call2 nicht verfügbar.

Ich kann die Wiederholung entweder über die gesamte Kette haben, aber ich würde es vorziehen, jeden Vorgang einzeln zu wiederholen.

Mein Code ist wie folgt, ich muss eine "callApi1()" vor dem callApi2 hinzufügen, und ich würde es vorziehen, wie ich sagte, eine andere beobachtbare mit Wiederholungen zu haben.

Observable.create(new Observable.OnSubscribe<String>() { 
       @Override 
       public void call(Subscriber<? super String> subscriber) { 
        try { 
         subscriber.onNext(callApi2()); 
         subscriber.onCompleted(); 
        } catch (Exception e) { 
         subscriber.onError(e); 
        } 
       } 
      }) 
      .retryWhen(new RetryWithDelay(20, 3000)) 
      .timeout(TIME_OUT_SECONDS, TimeUnit.SECONDS) 
      .observeOn(AndroidSchedulers.mainThread()) 
      .subscribeOn(Schedulers.io()) 
      .subscribe(new Subscriber<String>() { 
       @Override 
       public void onNext(String data) { 
         //show something 
       } 
      .... 
      } 

Antwort

0

Sie könnten die Observable.concat operator z.

Observable<String> obs1 = Observable.create(new Observable.OnSubscribe<String>() { 
      @Override 
      public void call(Subscriber<? super String> subscriber) { 
       try { 
        subscriber.onNext(callApi1()); 
        subscriber.onCompleted(); 
       } catch (Exception e) { 
        subscriber.onError(e); 
       } 
      } 
     }) 
     .timeout(TIME_OUT_SECONDS, TimeUnit.SECONDS) 
     .retryWhen(new RetryWithDelay(20, 3000))    
     .subscribeOn(Schedulers.io()); 

Observable<String> obs2 = Observable.create(new Observable.OnSubscribe<String>() { 
      @Override 
      public void call(Subscriber<? super String> subscriber) { 
       try { 
        subscriber.onNext(callApi2()); 
        subscriber.onCompleted(); 
       } catch (Exception e) { 
        subscriber.onError(e); 
       } 
      } 
     }) 
     .timeout(TIME_OUT_SECONDS, TimeUnit.SECONDS) 
     .retryWhen(new RetryWithDelay(20, 3000))    
     .subscribeOn(Schedulers.io()); 

Observable<String> chained = Observable.concat(obs1,obs2); 
+0

Ich brauche den zweiten Anruf nur gemacht werden, wenn der erste erfolgreich war. passiert das mit concat? – gdogaru

+0

Das hängt davon ab, was passiert, wenn Ihr API-Anruf fehlschlägt. Wenn es bei einem Fehler eine Ausnahme auslöst, sollten Sie das erforderliche Verhalten erhalten. – JohnWowUs