как извлекать наблюдаемые параллельно, при этом только один вызов API имеет логику повторных попыток - PullRequest
0 голосов
/ 02 июня 2019

Я хочу реализовать логику с использованием RxJava в моем приложении для Android, которое требует трех параллельных вызовов API. Только третий вызов API имеет логику повтора. Если после трех попыток успех будет достигнут, то последующий вызов будет выполнен для четвертого API, иначе только результат первого и второго вызовов API будет передан абоненту.

Я пытался добиться этого с помощью оператора Zip, но затем застрял с логикой повторения для третьего вызова API.

    Observable<String> observable1 = Observable.just("A","B");

    Observable<Integer> observable2 = Observable.just(1,2);

    Observable<Boolean> observable3 = Observable.just(Boolean.TRUE,     Boolean.FALSE);

Observable.zip (observable1, observable2, observable3, new Function3 () { @Override public Object apply (String s, Integer integer, Boolean aBoolean) выдает исключение { if (aBoolean == null) { alphabets3.retry (3) .doOnComplete (новое действие () { @Override public void run () создает исключение { // результат никогда не будет использован } }); }

            return s+integer+aBoolean;
        }
    }).subscribe(new Observer<Object>() {
        @Override
        public void onSubscribe(Disposable d) {

        }

        @Override
        public void onNext(Object o) {
            Log.e("onNext-->", o.toString());
        }

        @Override
        public void onError(Throwable e) {

        }

        @Override
        public void onComplete() {

        }
    });

1 Ответ

1 голос
/ 02 июня 2019

если в Obserable произошел сбой в каком-либо Observable, Zip потерпит неудачу в потоке. Единственный известный мне способ добиться параллельного выполнения и обработки ошибок с помощью Zip - это добавить onErrorResumeNext к каждому Observable, который сопоставляет ошибку с новой моделью в разобраться с этим позже ... и обработать то, что вы хотите сделать в функции отображения zip ... например

Obsevable.zip(
observable1.onErrorResumeNext{Observable.just(Model(it)},
observable2.onErrorResumeNext{Observable.just(Model(it)},
observable3.retryWhen {t is TimeOutException} //here you can add your retry logic
.onErrorResumeNext(t -> Observable.just(Model(t)),(m1 , m2, m3) -> Result()) 
...