2015-05-21 50 views
4

我正在编写一个Android应用程序。在某些时候,我需要检查从Retrofit方法返回的结果,如果它返回true - 再执行一个API请求。如果没有的Rx逻辑是这样的:根据条件将RxJava观察者添加到链中

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

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

我知道这是可能的,其中Rx包一切,但不完全知道如何做到这一点。有什么建议么?

回答

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()是我用以推动一个最初的同步处理个人最喜欢的方式)

否则,由于改造不支持RxJava的观测量(?与桥我认为),你可以有两种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

是的,我可以使用observables。解决方案是一个很好的解决方案。但是在理论上是否可以想出一些不需要onSuccess切换的东西?我正在查看像'switchCase'和'if'这样的所有操作符,但我不知道如何使用它们:) – Anton

+0

您可以尝试这些操作符,但它们更加冗长,重复操作符,可能不太易读。 – akarnokd

+0

好的,谢谢! – Anton