所以我有一个可观察的让我们说getDataObservable
它失败并且有时会发出错误并且没问题,但有时我需要它再次重试几次。
然后我使用像retryWhen(...)
这样的getDataObservable.retryWhen(...)
运算符
在这个运算符中,我必须给它一个函数,它接受参数Observable<Throwable>
(包含发出的错误)并返回任何类型的可观察的Observable<?>
。
从我对Docs中读到的内容的理解,此运算符.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);
});
}
}
答案 0 :(得分:0)
似乎我正在使用此类错误,例如.retryWhen(new RetryWhenObservable(5,1000))
,并且愿意在5
间隔尝试1 second
次,并且没有注意到该类中使用的单位是TimeUnit.SECONDS
所以它运行了一次观察并等待和等待傻的错误:P
我修改了类以便将来克服这个问题,然后构造函数看起来像new RetryWhenObservable(5,1000,TimeUnit.MILLIS)
来指定使用的时间单位
PS:在调试时首先仔细检查代码的愚蠢部分。