RetryWhen дает некоторые проблемы при использовании с Single - PullRequest
1 голос
/ 22 января 2020

Я пытаюсь выполнить вызов API с помощью модернизации и получить ответ от вызова. Я использую Single of Rx java, чтобы получить ответ. Что мне нужно сделать, так это повторить попытку вызова. Я просмотрел множество примеров, но, похоже, ни один из них не помог. (Также из-за моих ограниченных знаний о RX java и Kotlin).

Ниже приведена функция, которая выполняет вызов, и retryWhen функция, которую я написал

fun testFetch(): Single<ResponseBody>{
    return retrofitService.getCTLNetworkService().test().retryWhen {
        val ato = AtomicInteger()
        it.takeWhile {
            ato.incrementAndGet() < 4
        }.flatMap {
            Flowable.timer(1, TimeUnit.MINUTES)
        }
    }
}

Это именно то, чего я хочу достичь

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

Ниже приведена ошибка при компиляции кода

Type mismatch: inferred type is (Throwable!) -> Flowable<Long!>! but ((Throwable!) -> Publisher!)! was expected

ПРИМЕЧАНИЕ: изменен метод для простоты. Даже простой signle<ResponseBody> вызов без какого-либо картографа и модели не удается

1 Ответ

0 голосов
/ 31 января 2020

отметьте это Gist Link

Вот пример использования расширения

// import extension file 
import com.vk.extension.retryWhenError
 // example
 Observable.fromIterable<Int>(Arrays.asList(1, 2, 3)).retryWhen { it.retryWhenError()}
        .subscribe { integers: Int -> Log.d(TAG, "item $integers") }
...