我们希望对RxJava失败的场景进行重试
- 失败的时候抛出RuntimeException,以onError结束,如Retrofit网络请求
- 失败只是一个结果,不会抛出RuntimeException,最后会以onComplete结束
提供RetryWrapper进行处理
特别的,如果流程以Boolean返回标识成功或者失败,我们提供了BooleanRetryWrapper进行处理
提供RetryWhen进行处理
生成一个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代码: