我在 Android 应用程序中使用 rxjava 异步处理网络请求。现在,我想重新尝试一个失败的网络请求,只有在一定的时间后经过。
有没有什么方法可以在一个可观察的对象上使用 retry () ,但是只有在一定延迟之后才能重试?
有没有办法让观察者知道目前正在重试(而不是第一次尝试) ?
我看了一下 deounce ()/throtleWithTimeout () ,但它们似乎在做一些不同的事情。
编辑:
我想我找到了一种方法,但是我感兴趣的要么是确认这是正确的方法,要么是其他更好的方法。
我所做的是这样的: 在我的 Observer able.OnSubscribe 的 call ()方法中,在调用 SubscribersonError ()方法之前,我只是让 Thread 休眠所需的时间。为了每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 () ,延迟也是存在的。如果延迟没有应用到 之后而是 之前重试(但显然不是在第一次尝试之前) ,我会更喜欢它。