项目中有个接口必须要上报成功,否则要进行重试
重试次数为9,重试时间为2,4,8,16,24,32,64,128,256,512
我用rxjava实现了任意次数和任意时间的重试,其实都是使用Retry操作符实现的,
和我上次写的一篇文章: 用Rxjava2解决Token过期 自动重新请求 ,网络请求队列 ,
技术点基本一样,不同点在于上篇文章可以同时请求n个网络 ,这篇文章只能请求一个,
上篇文章没有重试时间。
看图说话
核心代码:RetryWithTime
activity中使用:
重试次数为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() { } }); }
代码都比较简单,记录下自己成长的脚印。。。