我正在使用RxJava在我的Android应用程序中异步处理网络请求。现在,我想在一定时间后仅重试失败的网络请求。
有没有办法在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(),延迟仍然存在。我希望如果延迟不是在错误之后应用,而是在重试之前应用(但显然不是在第一次尝试之前)。
Error:(73, 20) error: incompatible types: RetryWithDelay cannot be converted to Func1<? super Observable<? extends Throwable>,? extends Observable<?>>
- Nima GTRetryWithDelay
更改为以下内容:http://pastebin.com/6SiZeKnC - user1480019Observable
无关的实现(支持所有RxJava 2.x兼容的可观察对象,基于Publisher
接口)。链接在这里:https://pastebin.com/Jj1kWHKa。 - Eido95