根据条件

时间:2015-05-21 18:33:19

标签: 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包装所有内容,但不完全确定如何做到这一点。有什么建议?

1 个答案:

答案 0 :(得分:2)

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