Rx java 修改重试时可观察的源代码-RxJava

Rx java 修改重试时可观察的源代码-RxJava,rx-java,Rx Java,如何在重试时更新可观察的源 List<String> ids = new ArrayList<>(); // A,B,C Observable.from(ids) .retryWhen(errors -> { return errors .zipWith(Observable.range(0, 1), (n, i) -> i)

如何在重试时更新可观察的源

List<String> ids = new ArrayList<>(); // A,B,C
Observable.from(ids)
          .retryWhen(errors -> {
                    return errors
                    .zipWith(Observable.range(0, 1), (n, i) -> i)
                    .flatMap(retryCount -> Observable.timer((long) Math.pow(2, retryCount), TimeUnit.MINUTES));

           })
           .subscribe(....);
List id=new ArrayList();//A、 B,C
可观察。来自(ids)
.retryWhen(错误->{
返回错误
.zipWith(可观测范围(0,1),(n,i)->i)
.flatMap(retryCount->Observable.timer((长)Math.pow(2,retryCount),TimeUnit.MINUTES));
})
.认购(……);

现在,如果我想传递一些其他值,而不是将//A、B、C作为id传递。我该怎么做?或者这是正确的方法吗?

使用
延迟
。这将允许重新计算
ID

Observable.defer(() -> {
    List<String> ids = // compute this somehow
    return Observable.from(ids);
}).retryWhen(...
可观察。延迟(()->{
List id=//以某种方式计算
从(ids)可观察到的返回;
}).retryWhen(。。。

可以使用onErrorResumeNext

onErrorResumeNext
。您可能需要一些额外的逻辑来匹配您的用例。错误处理操作符的文档

List id=new ArrayList();//A,B,C
List ids2=new ArrayList();//D,E,F
可观察。来自(ids)
.onErrorResumeNext(可丢弃->{
从(ids2)中可观察到的返回值;
});

OneRorResumeNext在retryWhen timer流逝时被调用?目前,它将在第一次观察到的错误发出后立即被调用,您必须自己添加计时器逻辑。我在retryWhen中已经有一个计时器逻辑。但是,我假设计时器逻辑应该作为OneRorResumeNext的一部分?是的,计时器逻辑应该是在这种情况下,必须进入
OneRorResumeNext
。我只有一个订阅者。延迟为每个观察者创建一个新的观察者。你不认为OneRorResumeNext是一个更好的选择吗?你能澄清一下你的意思吗?订阅回调本身就是观察者-它接收来自上游的传入项目。因此这个术语“可观察”是指你正在观察的事物——它产生的项目可能会被一个观察者观察到。多个观察者可能暗示你在多播,而在本例中你不是。
List<String> ids = new ArrayList<>(); // A,B,C
List<String> ids2 = new ArrayList<>(); // D,E,F
Observable.from(ids)
        .onErrorResumeNext(throwable -> {
            return Observable.from(ids2);
        });