UDN-企业互联网技术人气社区

板块导航

浏览  : 1190
回复  : 0

[讨论交流] RxJava的错误处理一-retry

[复制链接]
舞操的头像 楼主
发表于 2016-9-5 10:00:00 | 显示全部楼层 |阅读模式
  RxJava的错误处理主要分为两类,retry系列以及onErrorRetrun系列。retry系列是当错误的时候,重新subscribe。onErrorReturn系列则是当出错了返回数据到onNext中。本文介绍下retry系列相关用法。

  retry

  retry系列的操作符主要有retry() ), retry(long) )和retry(Func2) ),retry(n)当发生onError的时候会重试n次,例如如下代码:

  1.   @Test

  2.   public void testRetry() {

  3.   final AtomicInteger atomicInteger = new AtomicInteger(0);

  4.   Observable.create(new Observable.OnSubscribe() {

  5.   @Override

  6.   public void call(Subscriber subscriber) {

  7.   subscriber.onNext(String.valueOf(System.currentTimeMillis()));

  8.   subscriber.onError(new Error("error"));

  9.   }

  10.   })

  11.   .doOnSubscribe(new Action0() {

  12.   @Override

  13.   public void call() {

  14.   atomicInteger.incrementAndGet();

  15.   }

  16.   })

  17.   .retry(2)

  18.   .toBlocking()

  19.   .subscribe(new TestSubscriber());

  20.   Assert.assertTrue(atomicInteger.intValue() == 3);

  21.   }
复制代码


  初始化atomicInteger为0,在doOnSubscribe加一,重试次数为2次,所以最终相当于onSubscribe执行了3次。

  retryWhen

  另外一个方法retryWhen的方法是根据得到的Throwable生成新的Observerable, 示例代码如下:

  
  1. @Test

  2.   public void testRetryWhen() {

  3.   final AtomicInteger atomicInteger = new AtomicInteger(3);

  4.   Observable.create(new Observable.OnSubscribe() {

  5.   @Override

  6.   public void call(Subscriber subscriber) {

  7.   subscriber.onNext(String.valueOf(System.currentTimeMillis()));

  8.   subscriber.onError(new Error(String.valueOf(atomicInteger.decrementAndGet())));

  9.   }

  10.   })

  11.   .retryWhen(new Func1, Observable>() {

  12.   @Override

  13.   public Observable call(Observable observable) {

  14.   return observable.takeWhile(new Func1() {

  15.   @Override

  16.   public Boolean call(Throwable throwable) {

  17.   return Integer.parseInt(throwable.getMessage()) > 0;

  18.   }

  19.   })

  20.   .flatMap(new Func1>() {

  21.   @Override

  22.   public Observable call(Throwable throwable) {

  23.   return Observable.timer(1, TimeUnit.SECONDS);

  24.   }

  25.   });

  26.   }

  27.   })

  28.   .toBlocking()

  29.   .subscribe(new TestSubscriber());

  30.   Assert.assertEquals(atomicInteger.intValue(), 0);

  31.   }
复制代码


  这里接受到throwable的Observerable后,用takeWhile来判断thrwoable的属性,这里用一个AtomicInteger,设置最大重试次数为3,每次减1,当等于0则不再重试,再现实生活中,也可以判断Exception的类型等方式判断是否需要重试。接着用flatMap返回Observerable.timer来延迟重试到1秒以后。

  参考

  How to handle exceptions thrown by observer’s onNext in RxJava?

  Error handling in RxJava

  Advanced error handling

  Catch

  Retry

原文作者:Juude  来源:开发者头条

相关帖子

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关于我们
联系我们
  • 电话:010-86393388
  • 邮件:udn@yonyou.com
  • 地址:北京市海淀区北清路68号
移动客户端下载
关注我们
  • 微信公众号:yonyouudn
  • 扫描右侧二维码关注我们
  • 专注企业互联网的技术社区
版权所有:用友网络科技股份有限公司82041 京ICP备05007539号-11 京公网网备安1101080209224 Powered by Discuz!
快速回复 返回列表 返回顶部