我正在尝试使用改型打API调用并接收该调用的响应。我正在使用Rxjava的Single获取响应。我需要做的是,如果 call 失败,请重试。
我看了很多例子,但似乎没有什么帮助(也是因为我对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>
调用,也会使失败
最佳答案
检查这个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") }
关于android - RetryWhen与Single一起使用时出现一些问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59856216/