RX Java-重试一些引发异常的代码



我正在尝试使用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结合在一起,您将获得预期的结果。

相关内容

  • 没有找到相关文章

最新更新