我正在尝试使用改型打API调用并接收该调用的响应。我正在使用Rxjava的Single获取响应。我需要做的是,如果呼叫失败,请重试。 我已经看了很多例子,但似乎没有什么帮助(也是由于我对RXjava和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 -> 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)");
* return Flowable.timer(counter.get(), TimeUnit.SECONDS);
* });
* })
* .blockingGet();
下面是我编译代码时的错误
Type mismatch: inferred type is (Throwable!) -> Flowable<Long!>! but ((Throwable!) -> Publisher!)! was expected
注意:为简单起见,更改了方法。甚至没有任何映射器和模型的简单signle<ResponseBody>
调用也会失败
答案 0 :(得分:0)
选中此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") }