描述
因此,我可以观察到,例如getDataObservable
失败,并且有时会发出错误,并且它可以,但有时我需要它重试几次。
然后使用retryWhen(...)
运算符,例如getDataObservable.retryWhen(...)
。
在此运算符中,我必须为它提供一个函数,该函数以参数Observable<Throwable>
(包含发出的错误)作为参数,并返回任意可见形式的Observable<?>
。
我认为
从我对文档中所读内容的理解中得知,该运算符.retryWhen(...)
使用给定函数返回的observable对其进行订阅,并且如果它发出任何内容,则表示我被告知要重新订阅
到getDataObservable
重试,但是如果返回的observable发出错误,则应表示不重试
问题
到目前为止还不错,但是当我从该函数返回一个Observable.timer(...)
(这是一个观察到的结果,在延迟一段时间后仅发出long
值),我认为.retryWhen(...)
应该订阅它并等待,直到它发出一个告诉它是,重新订阅您的父母
但相反,它无需等待即可直接完成
也许是一个线程问题,或者我对操作员的工作方式的理解是错误的,我需要与Observalbe.timer(...)
一起解决这个问题,之前遇到过此类问题的任何人都很高兴听到答案
注意:下面的类是对传递给.retryWhen(...)
而不是.retryWhen(new Func1<Observable<? extends Throwable>, Observable<?>>() {...})
的函数的总结
我使用.rertyWhen(new RetryWhenObservable(5,1000))
只是包装我的重试逻辑。
public class RetryWhenObservable implements Func1<Observable<? extends Throwable>, Observable<?>> {
private static final String TAG = "RetryWhenObservable";
int maxRetry, interval,retryCount = 0;
public RetryWhenObservable(int maxRetry, int interval) {
this.maxRetry = maxRetry;
this.interval = interval;
}
@Override
public Observable<?> call(Observable<? extends Throwable> attempts) {
return attempts.flatMap(throwable -> {
if (++retryCount < this.maxRetry) {
return Observable.timer(interval,TimeUnit.SECONDS);
}else
return Observable.error(throwable);
});
}
}
最佳答案
看来我在使用此类错误的类.retryWhen(new RetryWhenObservable(5,1000))
并愿意以5
的间隔尝试1 second
次,并且没有注意到该类中使用的单位是TimeUnit.SECONDS
,因此它运行一次可观察的并等待并等待愚蠢的错误:P
我修改了类以在将来克服此问题,然后构造函数类似于new RetryWhenObservable(5,1000,TimeUnit.MILLIS)
来指定使用的时间单位
PS:调试时,请首先仔细检查代码的愚蠢部分。