我正在关注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
我做错了什么?有什么不能像在示例中一样工作?
答案 0 :(得分:6)
我做错了什么?
请检查运营商的签名,以便使用正确的类型:https://github.com/ReactiveX/RxJava#base-class-vs-base-type
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
有关的事情
retryWhen
和repeatWhen
通过设计使用Publisher
作为重做信号,这样我们就可以利用背压来一次只询问一个这样的重做信号。使用Observable
,处理程序有可能只是立即转储大量信号,操作符可能会出现意外行为。
答案 1 :(得分:0)
显然使用Flowable.timer()
代替Observable.timer
修复此问题,也许它只是与Single
相关的内容?