RxJava-检查条件并仅在条件为真时重复一次
我使用RxJava-检查条件并仅在条件为真时重复一次,java,android,rx-java,reactive-programming,Java,Android,Rx Java,Reactive Programming,我使用RxJava+reformation在我的Android应用程序中进行API调用。当用户发出请求并且其令牌过期时,可能会出现这种情况。在这种情况下,我会在我的onNext中收到一个正常的响应,但响应中不包含结果,而是包含一个带有某些代码的错误元素。如果发生这种情况,我需要重新登录用户,只有在获得新的令牌后,才能重复原始请求。 所以我想用RxJava来组织这个。 为了使事情更简单,我将举一个简单的例子。假设我有以下方法: public void test(int someInt){
RxJava+reformation
在我的Android应用程序中进行API调用。当用户发出请求并且其令牌过期时,可能会出现这种情况。在这种情况下,我会在我的onNext
中收到一个正常的响应,但响应中不包含结果,而是包含一个带有某些代码的错误元素。如果发生这种情况,我需要重新登录用户,只有在获得新的令牌后,才能重复原始请求。
所以我想用RxJava
来组织这个。
为了使事情更简单,我将举一个简单的例子。假设我有以下方法:
public void test(int someInt){
Observable.just(someInt)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Subscriber<Integer>() {
@Override
public void onCompleted() {
log("onCompleted");
}
@Override
public void onError(Throwable e) {
e.printStackTrace();
log("onError");
}
@Override
public void onNext(Integer integer) {
log("onNext - " + integer);
}
});
公共无效测试(int-someInt){
可观察的。只是(someInt)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(新订户(){
@凌驾
未完成的公共无效(){
日志(“未完成”);
}
@凌驾
公共无效申报人(可丢弃的e){
e、 printStackTrace();
日志(“onError”);
}
@凌驾
public void onNext(整数){
log(“onNext-”+整数);
}
});
在调用onNext()
之前,我想检查是否(someInt==0)
。如果我得到false
我想继续并得到onNext()
已调用,但如果我得到true
我想执行一些操作并只重复一次原始可观察值,如果第二次条件返回false,我不想重复
有人能帮我弄清楚我有什么选择吗?
另外,我是RX世界的新手。
给你。因为你想重试整个链。retryWhen非常适合,所以你必须“玩”一点错误
在下面,如果您检测到无效令牌,您将传递一个错误(仅在第一次),retryWhen将捕获该错误并重新订阅整个接收链(从可观察开始。仅(someInt)
)
haveRetriedOnce=false;
可观察的。只是(someInt)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.flatMap(整数->{
如果(整数==0){
如果(已重试){
返回Observable.error(new UserOperationException());
}
//问题,抛出一个错误。retryWhen将捕获它
返回Observable.error(新的InvalidTokenException());
}否则{
返回可观测值。just(整数);
}
})
.retryWhen(可观察->可观察.flatMap(可丢弃->{
if(InvalidTokenException的可丢弃实例){
haveRetriedOnce=true;
仅返回(0);//重试,此处的int不相关
}否则{
//其他错误,请进一步传递
返回可观测误差(可丢弃);
}
}))
.subscribe(新订户(){
@凌驾
未完成的公共无效(){
日志(“未完成”);
}
@凌驾
公共无效申报人(可丢弃的e){
e、 printStackTrace();
日志(“onError”);
}
@凌驾
public void onNext(整数){
log(“onNext-”+整数);
}
}
此处不允许“返回”
:可观察返回。只需(-1)
haveRetriedOnce = false;
Observable.just(someInt)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.flatMap(integer ->{
if(integer == 0){
if(haveRetriedOnce){
return Observable.error(new UserOperationException());
}
// problem, throw an error and the .retryWhen will catch it
return Observable.error(new InvalidTokenException());
}else{
return Observable.just(integer);
}
})
.retryWhen(observable -> observable.flatMap(throwable->{
if(throwable instanceOf InvalidTokenException){
haveRetriedOnce = true;
return just(0); // retry, the int here is irrelevant
}else{
// other error, pass it further
return Observable.error(throwable);
}
}))
.subscribe(new Subscriber<Integer>() {
@Override
public void onCompleted() {
log("onCompleted");
}
@Override
public void onError(Throwable e) {
e.printStackTrace();
log("onError");
}
@Override
public void onNext(Integer integer) {
log("onNext - " + integer);
}
}