【问题标题】:Type error on RetryWhen() with delayRetryWhen() 上的类型错误有延迟
【发布时间】:2018-05-14 07:56:56
【问题描述】:

我关注了this tutorial,然后添加了这一行:

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

给我的Transformer,但是它触发了编译错误:

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

error -> Observable.timer(30, TimeUnit.SECONDS) 下方的波浪线表示:

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

我做错了什么?像示例中那样工作缺少什么?

【问题讨论】:

    标签: rx-java2 rx-android


    【解决方案1】:

    我做错了什么?

    请检查运算符的签名,以便您使用正确的类型: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,处理程序有可能一次简单地转储大量信号,操作员可能会出现意外行为。

    【讨论】:

    • 我在文档中看到了该示例,但我发现它过于复杂,并决定现在我只想要一个固定的延迟。我是 Rx 的新手,所以我想先熟悉简单的事情。非常感谢!
    • @akarnokd 在重试最大次数后如何返回错误? Flowable.error(new RunTimeException("")) 不会编译
    • @hector 可能会添加类型参数,例如Flowable.&lt;YourType&gt;error()
    • @akarnokd 感谢您的建议。它解决了我的编译错误。
    【解决方案2】:

    显然使用Flowable.timer() 而不是Observable.timer 解决了这个问题,也许它只与Single 有关?

    【讨论】:

      猜你喜欢
      • 2017-01-01
      • 1970-01-01
      • 2017-12-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-29
      • 2011-05-20
      • 1970-01-01
      相关资源
      最近更新 更多