根据条件将RxJava Observer添加到链中

4

我正在编写一款Android应用程序。某个时刻,我需要检查来自Retrofit方法返回的结果,如果返回true,则执行另一个API请求。没有使用Rx时,逻辑如下:

if(api.isVip()) {
   checkIfPendingCancellation();
} else {
   JoinVipActivity.start();
}

checkIfPendingCancellation() {
    if(api.pendingCancel()) {
        YourVipIsAboutToCancelActivity.start();
    } else {
        CancelVipActivity.start();
   } 
}

我知道可以用Rx来包装所有东西,但不太确定如何做到这一点。有什么建议吗?

1个回答

3
假设API不基于RxJava,您可以按照以下方式操作:
Observable.just(1)
.map(v -> {
    if (api.isVip()) {
       if (api.pendingCancel()) {
           return 1;
       }
       return 2;
    }
    return 3;
})
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(v -> {
    if (v == 1) {
       YourVipIsAboutToCancelActivity.start();
    } else
    if (v == 2) {
       CancelVipActivity.start();
    } else {
       JoinVipActivity.start();
    }
});

(注:Observable.just(1).map().subscribeOn() 是我个人最喜欢的启动同步处理的方法。)
另外,由于Retrofit支持RxJava的Observables(我想是通过一个桥接实现的),因此您可以将这两个API调用都作为Observable<Boolean>,在这种情况下,您可以使用flatMap
api.isVip()
.flatMap(b -> {
    if (b) {
        return api.pendingCancel().map(c -> c ? 1 : 2);
    }
    return Observable.just(3);
})
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(v -> {
    if (v == 1) {
       YourVipIsAboutToCancelActivity.start();
    } else
    if (v == 2) {
       CancelVipActivity.start();
    } else {
       JoinVipActivity.start();
    }
});

1
是的,我可以使用可观察对象。而且这个解决方案很好。但是理论上有没有可能想出一些不需要在onSuccess中使用switch的东西呢?我看了所有那些操作符,比如'switchCase'和'if',但我不知道如何使用它们 :) - Anton
您可以尝试使用那些方法,但它们更冗长,重复操作符,并且可能不太易读。 - akarnokd

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接