描述

因此,我可以观察到,例如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:调试时,请首先仔细检查代码的愚蠢部分。

10-06 13:21