RxJava2 延时重试网络请求,任意重试次数网络请求,任意延时时间

项目中有个接口必须要上报成功,否则要进行重试
重试次数为9,重试时间为2,4,8,16,24,32,64,128,256,512
我用rxjava实现了任意次数和任意时间的重试,其实都是使用Retry操作符实现的,
和我上次写的一篇文章: 用Rxjava2解决Token过期 自动重新请求 ,网络请求队列
技术点基本一样,不同点在于上篇文章可以同时请求n个网络 ,这篇文章只能请求一个,
上篇文章没有重试时间。


看图说话



核心代码:RetryWithTime 
package com.example.rxjavademo;

import java.util.Date;
import java.util.concurrent.TimeUnit;

import io.reactivex.Observable;
import io.reactivex.ObservableSource;
import io.reactivex.functions.Function;

/**
 * Created by 瑜哥 on 2018/4/13.
 */

public class RetryWithTime implements Function<Observable<Throwable>, ObservableSource<RequsetBean>> {
    int current = -1;
    //延时时间随心所欲,媳妇再也不用担心时间太短了,只需在数组任意添加延时时间即可
    int[] timeDely = new int[]{1, 3, 5, 4, 2, 3, 5, 4, 2, 1};

    @Override
    public Observable apply(Observable<Throwable> throwableObservable) throws Exception {
        return throwableObservable.flatMap(new Function<Throwable, Observable<Long>>() {
            @Override
            public Observable<Long> apply(Throwable throwable) throws Exception {
                ++current;
                System.out.println("retry:" + current + String.format(" 时间:%tT", new Date()));
                if (throwable instanceof MyTokenException && current < timeDely.length) {
                    return Observable.timer(timeDely[current], TimeUnit.SECONDS);
                } else {
                    return Observable.error(throwable);
                }
            }
        });
    }
}




activity中使用:

   private void mains1() {
        RequsetBean requsetBean = new RequsetBean("0");
        Observable.just(requsetBean)
                .flatMap(new Function<RequsetBean, ObservableSource<RequsetBean>>() {
                    @Override
                    public ObservableSource<RequsetBean> apply(RequsetBean requsetBean) throws Exception {
//                        -----------假装请求过网络了------------
                        requsetBean.retryTime++;
                        if (requsetBean.retryTime==6)
                            requsetBean.isRequestSuccess = true;
//                        -----------网络请求结果------------
                        if (requsetBean.isRequestSuccess) { //网络请求成功
                             return Observable.just(requsetBean);
                        } else {//网络请求失败
                            return Observable.error(new MyTokenException());//重新请求
                        }
                    }
                }) .retryWhen(new RetryWithTime())//重试
                .subscribe(new Observer<RequsetBean>() {
                    @Override
                    public void onSubscribe(Disposable d) {
                    }

                    @Override
                    public void onNext(RequsetBean value) {
                        System.out.println("成功请求网络,重试次数" + value.retryTime);
                    }

                    @Override
                    public void onError(Throwable e) {
                        System.out.println("请求网络失败");
                    }

                    @Override
                    public void onComplete() {
                    }
                });
    }

代码都比较简单,记录下自己成长的脚印。。。


猜你喜欢

转载自blog.csdn.net/qq_35599978/article/details/80290252