2016-05-10 6 views
1

Мой вариант использования: у меня есть приложение для Android, мне нужно вызвать один api, когда эти данные станут доступными, вызовите второй api. Для этого я планировал использовать RxAndroid с повторениями.Chain 2 calls with retry using RxAndroid

Я смог выполнить 1 api-вызов с повторениями, но мне нужно связать 2 и иметь возможность отображать 2 разных ошибки, один для вызова 1 недоступен, а один для call2 недоступен.

Я могу повторить попытку на всей цепочке, но я бы предпочел повторить каждую операцию отдельно.

Мой код следующий, мне нужно добавить «callApi1()» перед вызовомApi2, и я бы предпочел, как я сказал, что у меня разные наблюдаемые попытки.

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 
       } 
      .... 
      } 

ответ

0

Вы можете использовать Observable.concat operator, например.

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

Мне нужен второй звонок, который должен быть выполнен только в том случае, если первый преуспел. это происходит с concat? – gdogaru

+0

Это зависит от того, что происходит, когда ваш вызов api завершается неудачно. Если он выдает исключение при ошибке, вы должны получить требуемое поведение. – JohnWowUs