RxJava的retryWhen运算符

时间:2018-11-02 08:57:09

标签: android rx-java2 retrywhen

我试图深入了解retryWhen运算符,并且我有一些如下代码。

    Flowable.just(1, 2, 3, 4, 5)
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .retryWhen { throwable ->
                Log.d("Debug", "retryWhen proceed...")
                throw Exception("There is a exception")
            }
            .subscribe(
                    { item ->
                        Log.d("Debug", "success : $item")
                    },
                    { throwable ->
                        Log.d("Debug", "error : ${throwable.message}")
                    },
                    {
                        Log.d("Debug", "complete")
                    }
            )

结果显示如下。

  

调试:重试执行时...

     

调试:错误:存在异常

问题是何时触发retryWhen运算符?

我假设只有在发生异常时才会触发retryWhen运算符。

但是结果不是我想的那么明显,

对此有何想法?谢谢!

1 个答案:

答案 0 :(得分:2)

retryWhen { errors -> ... }取一个Observable<Throwable>并应返回一个Observable,该值将返回重试的任何内容,或者返回错误 stop重试的错误。

一个例子可能是:

.retryWhen(attempts -> {
  return attempts.zipWith(Observable.range(1, 3), (n, i) -> i).flatMap(i -> {
    System.out.println("delay retry by " + i + " second(s)");
    return Observable.timer(i, TimeUnit.SECONDS);
  });
})

(摘自http://reactivex.io/documentation/operators/retry.html
此代码将延迟每次重试。

顺便说一句,在这种方法中不应该抛出异常。

文档:
* Great blog article解释了retryWhen