在RetryWhen()上输入错误并带有延迟

时间:2018-05-14 07:56:57

标签: rx-java2 rx-android

我正在关注this tutorial然后添加此行:

.retryWhen(errors -> errors.flatMap(error -> Observable.timer(30, TimeUnit.SECONDS)))

到我的Transformer,但它会触发编译错误:

  

错误:不兼容的类型:无法推断类型变量R   (参数不匹配; lambda表达式中的错误返回类型   Observable无法转换为Publisher)   其中R,T是类型变量:   R扩展方法flatMap中声明的Object(Function>)   T扩展了类Flowable

中声明的Object

error -> Observable.timer(30, TimeUnit.SECONDS)下面的波浪线说:

  

不存在类型变量R的实例,以便Observable符合Publisher

我做错了什么?有什么不能像在示例中一样工作?

2 个答案:

答案 0 :(得分:6)

  

我做错了什么?

请检查运营商的签名,以便使用正确的类型:https://github.com/ReactiveX/RxJava#base-class-vs-base-type

JavaDoc

public final Single<T> retryWhen(
    Function<? super Flowable<Throwable>,? extends Publisher<?>> handler)
  

因为本教程使用了Observable.timer而没有任何问题。

该教程早于RxJava 2.实际上,上面链接的Javadoc包含Flowable.timer()的示例:

Single.timer(1, TimeUnit.SECONDS)
.doOnSubscribe(s -> System.out.println("subscribing"))
.map(v -> { throw new RuntimeException(); })
.retryWhen(errors -> {
    AtomicInteger counter = new AtomicInteger();
    return errors
              .takeWhile(e -> counter.getAndIncrement() != 3)
              .flatMap(e -> {
                  System.out.println("delay retry by " + counter.get() + " second(s)");
//                vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
                  return Flowable.timer(counter.get(), TimeUnit.SECONDS);
//                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
              });
})
.blockingGet();
  

这是与Single

有关的事情

retryWhenrepeatWhen通过设计使用Publisher作为重做信号,这样我们就可以利用背压来一次只询问一个这样的重做信号。使用Observable,处理程序有可能只是立即转储大量信号,操作符可能会出现意外行为。

答案 1 :(得分:0)

显然使用Flowable.timer()代替Observable.timer修复此问题,也许它只是与Single相关的内容?