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

标签 java android rx-java

我正在编写一个 Android 应用程序。在某些时候,我需要检查从 Retrofit 方法返回的结果,如果它返回 true - 再执行一个 API 请求。没有 Rx,逻辑看起来像这样:

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

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

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

最佳答案

假设 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();
    }
});

关于java - 根据条件将 RxJava Observer 添加到链中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30381728/

相关文章:

java - 压缩不同类型的多个可观察对象

java - RxJava 中的笛卡尔积

android - RxJava2 JUnit 测试

java - 如何上传新版本的文档使用 alfresco restful api?

java - Spring Boot - 使用 Gmail 发送电子邮件

java - BaseExpandableListAdapter 的 getChildrenCount() 上出现 NullPointerException

java - Android 版谷歌地图应用程序无法在市场上使用

Java 扫描器在处理中不起作用

java - 如何修改displaytag中某列的空值?

android - 重试 HTTP(S) POST,直到它们在 Android 上成功