gpt4 book ai didi

java - RxJava - 检查条件并仅在条件为真时重复一次

转载 作者:太空宇宙 更新时间:2023-11-03 12:49:07 27 4
gpt4 key购买 nike

我使用 RxJava + Retrofit 在我的 Android 应用程序中进行 API 调用。可能会出现用户发出请求而他的 token 已过期的情况。在这种情况下,我在 onNext 中收到正常响应,但响应不包含结果,而是包含一些代码的错误元素。如果发生这种情况,我需要重新登录用户,并且只有在获得新 token 后才重复原始请求。所以我想使用 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);
}
});

我想检查 if (someInt == 0) before onNext() 被调用。如果我得到 false,我想继续并调用 onNext(),但是如果我得到 true,我想执行一些操作并重复原来只能观察一次,如果条件第二次返回 false 我不想再重复了。

有人可以帮我弄清楚我对此有哪些选择吗?附言我是 RX 世界的新手。

最佳答案

给你。因为你想重试整个链 .retryWhen 非常适合它所以你必须“玩”一下错误。

下面如果你检测到一个无效的 token ,你传递一个错误(仅在第一次),retryWhen 将捕获并重新订阅整个 rx 链(从 Observable.just(someInt) ).

 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);
}
}

关于java - RxJava - 检查条件并仅在条件为真时重复一次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35650744/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com