【问题标题】:how to fetch observables in parallel, wherein only one api call has a retry logic如何并行获取 observables,其中只有一个 api 调用具有重试逻辑
【发布时间】:2019-10-18 05:42:48
【问题描述】:

我想在我的 android 应用程序中使用 RxJava 实现一个逻辑,这需要三个并行的 api 调用。只有第三个 api 调用有重试逻辑。如果在尝试了 3 次后都成功了,那么将会对第四个 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() { @覆盖 public Object apply(String s, Integer integer, Boolean aBoolean) throws Exception { if (aBoolean==null){ 字母3.重试(3).doOnComplete(新动作(){ @覆盖 公共无效运行()抛出异常{ // 结果永远不会被使用 } }); }

            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() {

        }
    });

【问题讨论】:

    标签: android zip rx-java2 operator-keyword retrywhen


    【解决方案1】:

    如果 Zip 运算符中的任何 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()) 
    

    【讨论】:

    • 您好,您建议的解决方案有一个问题。如果第三个可观察对象的响应失败,则 Zip 运算符将不会传递第一个和第二个可观察对象的结果。所以,我想要的是,不管任何 observable 的结果如何,其他 observable 应该能够将它们的结果发送到订阅者方法的 onNext。我该如何做到这一点?
    • 是的,这就是为什么第三个有重试和 onErrorResumeNext ......所以你重试一种错误并使用 onErrorResumeNext 消耗其他错误,这样它就不会中断流
    • 你可以传你的代码,我在我的机器上试试@Android1005
    猜你喜欢
    • 1970-01-01
    • 2022-12-08
    • 1970-01-01
    • 1970-01-01
    • 2016-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-02
    相关资源
    最近更新 更多