我在我的 Android 应用程序中使用 rxjava 来异步处理网络请求。现在我只想在经过一定时间后重试失败的网络请求。
有什么方法可以在 Observable 上使用 retry() 但仅在一定延迟后重试?
有没有办法让 Observable 知道当前正在重试(而不是第一次尝试)?
我看了一下 debounce()/throttleWithTimeout() 但他们似乎在做一些不同的事情。
编辑:
我想我找到了一种方法,但我对确认这是正确的方法或其他更好的方法感兴趣。
我正在做的是:在我的 Observable.OnSubscribe 的 call() 方法中,在我调用 Subscribers onError() 方法之前,我只是让线程休眠所需的时间。因此,要每 1000 毫秒重试一次,我会执行以下操作:
@Override
public void call(Subscriber<? super List<ProductNode>> subscriber) {
try {
Log.d(TAG, "trying to load all products with pid: " + pid);
subscriber.onNext(productClient.getProductNodesForParentId(pid));
subscriber.onCompleted();
} catch (Exception e) {
try {
Thread.sleep(1000);
} catch (InterruptedException e1) {
e.printStackTrace();
}
subscriber.onError(e);
}
}
由于此方法无论如何都在 IO 线程上运行,因此它不会阻塞 UI。我能看到的唯一问题是,即使是第一个错误也会延迟报告,所以即使没有 retry(),延迟也会存在。如果延迟不是在错误 之后 应用而是 在 重试之前应用(但显然不是在第一次尝试之前),我会更喜欢它。
原文由 david.mihola 发布,翻译遵循 CC BY-SA 4.0 许可协议
您可以使用
retryWhen()
运算符将重试逻辑添加到任何 Observable。以下类包含重试逻辑:
RxJava 2.x
RxJava 1.x
用法: