RxJava(六) retryWhen操作符实现错误重试机制

原创 2016年05月30日 17:28:37

欢迎转载,转载请标明出处:
http://blog.csdn.net/johnny901114/article/details/51539708
本文出自:【余志强的博客】

RxJava系列文章目录导读:

一、RxJava create操作符的用法和源码分析

二、RxJava map操作符用法详解

三、RxJava flatMap操作符用法详解

四、RxJava concatMap操作符用法详解

五、RxJava onErrorResumeNext操作符实现app与服务器间token机制

六、RxJava retryWhen操作符实现错误重试机制

七、RxJava 使用debounce操作符优化app搜索功能

八、RxJava concat操作处理多数据源

九、RxJava zip操作符在Android中的实际使用场景

十、RxJava switchIfEmpty操作符实现Android检查本地缓存逻辑判断

十一、RxJava defer操作符实现代码支持链式调用

十二、combineLatest操作符的高级使用

业务需求

当我们在app里发起网络请求时,可能会因为各种问题导致失败。如何利用RxJava来实现出现错误后重试若干次,并且可以设定重试的时间间隔。

具体实现

网络请求使用Retrofit来做,还是使用上篇博客中的请求用户信息接口

    @GET("/userinfo?noToken=1")
    Observable<Response> getUserInfoNoToken();

下面是请求用户信息接口的逻辑代码

userApi.getUserInfoNoToken()
                        //总共重试3次,重试间隔3000毫秒
                        .retryWhen(new RetryWithDelay(3, 3000))
                        .observeOn(AndroidSchedulers.mainThread())
                        .subscribeOn(Schedulers.io())
                        .subscribe(new Action1<Response>() {
                            @Override
                            public void call(Response response) {
                                String content = new String(((TypedByteArray) response.getBody()).getBytes());
                                printLog(tvLogs, "", content);
                            }
                        }, new Action1<Throwable>() {
                            @Override
                            public void call(Throwable throwable) {
                                throwable.printStackTrace();
                            }
                        });

RetryWithDelay

public class RetryWithDelay implements
            Func1<Observable<? extends Throwable>, Observable<?>> {

        private final int maxRetries;
        private final int retryDelayMillis;
        private int retryCount;

        public RetryWithDelay(int maxRetries, int retryDelayMillis) {
            this.maxRetries = maxRetries;
            this.retryDelayMillis = retryDelayMillis;
        }

        @Override
        public Observable<?> call(Observable<? extends Throwable> attempts) {
            return attempts
                    .flatMap(new Func1<Throwable, Observable<?>>() {
                        @Override
                        public Observable<?> call(Throwable throwable) {
                            if (++retryCount <= maxRetries) {
                                // When this Observable calls onNext, the original Observable will be retried (i.e. re-subscribed).
                                printLog(tvLogs, "", "get error, it will try after " + retryDelayMillis
                                        + " millisecond, retry count " + retryCount);
                                return Observable.timer(retryDelayMillis,
                                        TimeUnit.MILLISECONDS);
                            }
                            // Max retries hit. Just pass the error along.
                            return Observable.error(throwable);
                        }
                    });
        }
    }

如何模拟重试呢?

方法一:把服务器关闭,关闭服务器后,客户端请求接口的必然会报错,看看是不是重试三次。

运行输出:

'get error, it will try after 3000 millisecond, retry count 1'
Main Thread:false, Thread Name:Retrofit-Idle

'get error, it will try after 3000 millisecond, retry count 2'
Main Thread:false, Thread Name:Retrofit-Idle

'get error, it will try after 3000 millisecond, retry count 3'
Main Thread:false, Thread Name:Retrofit-Idle

上面是重试三次了,但是我们怎么知道,如果在服务器启动后,在接下的重试中请求成功呢?接下来试试方法二。

方法二:先把服务器关闭,当点击按钮请求的同时,启动Tomcat服务器。

运行输出:

'get error, it will try after 3000 millisecond, retry count 1'
Main Thread:false, Thread Name:Retrofit-Idle

'get error, it will try after 3000 millisecond, retry count 2'
Main Thread:false, Thread Name:Retrofit-Idle

'username:chiclaim,age:007'
Main Thread:true, Thread Name:main

可以发现,在第三次重试的时候,服务器可用了。


本文的例子放在github上 https://github.com/chiclaim/android-sample/tree/master/rxjava

版权声明:本文为博主原创文章,未经博主允许不得转载。

RxJava retryWhen操作符实现错误重试机制

业务需求当我们在app里发起网络请求时,可能会因为各种问题导致失败。如何利用RxJava来实现出现错误后重试若干次,并且可以设定重试的时间间隔。具体实现网络请求使用Retrofit来做,请求用户信息接...
  • jdsjlzx
  • jdsjlzx
  • 2016年06月20日 17:45
  • 8136

RxJava操作符repeatWhen()和retryWhen()

第一次见到.repeatWhen()和.retryWhen()这两个操作符的时候就非常困惑了。不得不说,它们绝对是“最令人困惑弹珠图”的有力角逐者。然而它们都是非常有用的操作符:允许你有条件的重新订阅...
  • jdsjlzx
  • jdsjlzx
  • 2016年05月26日 10:34
  • 4146

[Android开发] RxJava2之路七 - 错误处理操作符例子Demo

一、错误处理操作符列表用于对Observable发射的 onError 通知做出响应或者从错误中恢复,例如,你 可以: 吞掉这个错误,切换到一个备用的Observable继续发射数据 吞掉这个错误...

RxJava retryWhen操作符实现错误重试机制

业务需求 当我们在app里发起网络请求时,可能会因为各种问题导致失败。如何利用RxJava来实现出现错误后重试若干次,并且可以设定重试的时间间隔。 具体实现 网络请求使用Retrof...

有关RXjava retryWhen

Observable.just(10000000).flatMap(new Func1>() { @Override public Observable...
  • new_abc
  • new_abc
  • 2017年01月17日 11:54
  • 496

Rxjava操作符(defer,compose,retryWhen)

上一篇博客讲了Retrofit的简单使用,应该看过的都基本了解我们公司这个服务器请求网络数据的流程,我来简单梳理一下: 第一次登录,创建cookiejar,请求服务器数据,保存accesstoke...

RxJava操作符(06-错误处理)

转载请标明出处: http://blog.csdn.net/xmxkf/article/details/51656736 本文出自:【openXu的博客】目录:Catch Retry 源码下载...

RxJava 2.0有什么不同(译)

为什么翻译这篇文章ReactiveX 于2016.10.29 发布了正式版RxJava 2.0.0,但到我写本文章为止,还没有发现谁完整的翻译了官方的这篇文档 What’s-different-in-...

RxJava2总结之操作详解(三)

目录目录 合并操作符 zip静态方法 zipWith merge静态方法 mergeWith combineLatest静态方法 withLatestFrom switchMap startWith ...

Retrofit2+Rxjava2联网的封装

Retrofit2+Rxjava2联网模块的封装以及mvp架构的使用
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:RxJava(六) retryWhen操作符实现错误重试机制
举报原因:
原因补充:

(最多只允许输入30个字)