RX java重试当计时器没有重新订阅到可观察的

时间:2017-11-10 13:56:55

标签: java android networking timer rx-java

描述

所以我有一个可观察的让我们说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);
    });
  }
}

1 个答案:

答案 0 :(得分:0)

似乎我正在使用此类错误,例如.retryWhen(new RetryWhenObservable(5,1000)),并且愿意在5间隔尝试1 second次,并且没有注意到该类中使用的单位是TimeUnit.SECONDS所以它运行了一次观察并等待和等待傻的错误:P

我修改了类以便将来克服这个问题,然后构造函数看起来像new RetryWhenObservable(5,1000,TimeUnit.MILLIS)来指定使用的时间单位

PS:在调试时首先仔细检查代码的愚蠢部分。