Ошибка типа на RetryWhen () с задержкой - PullRequest
0 голосов
/ 14 мая 2018

Я следовал этому уроку и затем добавил эту строку:

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

К моему Transformer, но это вызывает ошибку компиляции:

ошибка: несовместимые типы: невозможно определить переменную типа (типов) R (несоответствие аргумента; неверный тип возврата в лямбда-выражении Observable не может быть преобразовано в Publisher), где R, T являются переменными типа: R расширяет объект, объявленный в методе flatMap (Function>) T расширяет Объект, объявленный в классе Flowable

И волнистые линии ниже error -> Observable.timer(30, TimeUnit.SECONDS) говорят:

нет экземпляров экземпляров переменной (ей) типа R не существуеттак что Observable соответствует Publisher

Что я делаю не так?Чего не хватает, чтобы это работало как в примере?

Ответы [ 2 ]

0 голосов
/ 14 мая 2018

Что я делаю не так?

Пожалуйста, проверьте подписи операторов, чтобы использовать правильные типы: 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

retryWhen и repeatWhen, использующим Publisher в качестве сигнала повтораспроектировать так, чтобы мы могли использовать противодавление, чтобы запрашивать только один такой сигнал повтора за раз.С Observable есть вероятность, что обработчик просто сбросит много сигналов одновременно, и операторы могут вести себя неожиданно.

0 голосов
/ 14 мая 2018

Видимо, использование Flowable.timer() вместо Observable.timer исправляет это, может быть, это связано только с Single?

...