封装了几个处理RxJava Retry操作的类
OverView
我们希望对RxJava失败的场景进行重试
RxJava的流程失败一般有两种场景:
- 失败的时候抛出RuntimeException,以onError结束,如Retrofit网络请求
- 失败只是一个结果,不会抛出RuntimeException,最后会以onComplete结束
不抛出RuntimeException的场景
提供RetryWrapper进行处理
特别的,如果流程以Boolean返回标识成功或者失败,我们提供了BooleanRetryWrapper进行处理
抛出RuntimeException的场景
提供RetryWhen进行处理
提供了rxjava和rxjava2的版本
Demo
定义source
生成一个0-100的随机整数,小于50代表成功,大于50代表失败,这代表了成功率为50%。
定义两个源,一个以Boolean值返回成功失败,另一个失败的时候会抛出RuntimeException:
Observable.just(new Random()) .map(new Func1<Random, Integer>() { @Override public Integer call(Random random) { return random.nextInt(100); } }) .map(new Func1<Integer, Boolean>() { @Override public Boolean call(Integer integer) { Log.d("test", "executeTimes: " + executeTimes++); return integer < 50; } });
Observable.just(new Random()) .map(new Func1<Random, Integer>() { @Override public Integer call(Random random) { return random.nextInt(100); } }) .doOnNext(new Action1<Integer>() { @Override public void call(Integer integer) { Log.d("test", "executeTimes: " + executeTimes++); if (integer > 50) { throw new RuntimeException(); } } });
使用
- 不抛出RuntimeException的场景
private void retry1() { executeTimes = 0; new BooleanRetryWrapper(sourceMayFail()) .retry(3) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Action1<Boolean>() { @Override public void call(Boolean aBoolean) { Toast.makeText(RxJavaDemo.this, "testRetry complete: " + aBoolean, Toast.LENGTH_SHORT).show(); Log.d("test", "testRetry complete: " + aBoolean); } }, new Action1<Throwable>() { @Override public void call(Throwable throwable) { Toast.makeText(RxJavaDemo.this, "testRetry error: " + throwable.toString(), Toast.LENGTH_SHORT).show(); Log.d("test", "testRetry error: " + throwable.toString()); } }); }
- 抛出RuntimeException的场景
private void retry2() { executeTimes = 0; sourceMayFailThrow() .retryWhen(new RetryWhen(3, 500)) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Action1<Integer>() { @Override public void call(Integer integer) { Toast.makeText(RxJavaDemo.this, "testRetry complete: " + integer, Toast.LENGTH_SHORT).show(); Log.d("test", "testRetry complete: " + integer); } }, new Action1<Throwable>() { @Override public void call(Throwable throwable) { Toast.makeText(RxJavaDemo.this, "testRetry error: " + throwable.toString(), Toast.LENGTH_SHORT).show(); Log.d("test", "testRetry error: " + throwable.toString()); } }); }
Demo代码: