我正在尝试使用rx java来消耗一些数据来源的源,这些数据是保留发送对象的来源。
我想知道如何针对我自己的代码引发异常的情况实施重试策略。例如,网络异常应触发以指数向后策略的重试。
一些代码:
message.map(this::processMessage)
.subscribe((message)->{
//do something after mapping
});
processMessage(message)
是包含可能失败的风险代码的方法,也是我要重试的代码的一部分,但我不想阻止可观察到的可观察到的数据。
对此有任何想法吗?
message
.map(this::processMessage)
.retryWhen(errors -> errors.flatMap(error -> {
if (error instanceof IOException) {
return Observable.just(null);
}
// For anything else, don't retry
return Observable.error(error);
})
.subscribe(
System.out::println,
error -> System.out.println("Error!")
);
或捕获错误
message.map(this::processMessage)
.onErrorReturn(error -> "Empty result")
.subscribe((message)->{})
或procs误差
message
.map(this::processMessage)
.doOnError(throwable -> Log.e(TAG, "Throwable " + throwable.getMessage()))
.subscribe(
System.out::println,
error -> System.out.println("Error!")
);
未经测试,但重复反复的重复时,不仅在oncomplete中被调用。
http://blog.danlew.net/2016/01/25/rxjavas-repeatwhen-and-and-retrywhen-explaind/->每个错误都是平面绘制的,因此我们可以返回Onnext(null)(触发repubscription)或OnError(error)(避免repubscription)。
退缩政策:
source.retryWhen(errors ->
errors
.zipWith(Observable.range(1, 3), (n, i) -> i)
.flatMap(retryCount -> Observable.timer((long) Math.pow(5, retryCount), TimeUnit.SECONDS))
);
在这种情况下,flatmap 计时器比延迟更可取,因为它使我们可以通过重试的数量修改延迟。以上撤回了三次,每个重试延迟5 ^ retrycount,只需几个操作员就可以指数向退缩!
以文章为例:
https://medium.com/@v.danylo/server-polling-and-retrying-fail--fail--with-retrofit-and-rofit-and-rxjava-8bcc7e641a5a#.a6ll8d55bt
http://kevinmarlow.me/better-networking-with-rxjava-and-retrofit-on-android/
他们帮助我开场。
最近我开发了完全适合您需求的库。
retrofitrxerrorhandler
如果将Exponential
策略与backupObservable
结合在一起,您将获得预期的结果。