我正在用 RxJava/Android 开发一个完整的应用程序,试图让事情尽可能地符合 Rx 方式。
我想我正在实现我想要的,但现在我遇到了一个问题,我确信存在更好的方法来做到这一点。 它包括:
- 从 Observable 获取 bool 值
- A:如果为真,则完成,返回真。 B:如果为假,则发出请求(称为 firstRequest)并接收 Observable。
- A:同理,如果为真,你就完了,返回真。 B:如果为假,则再发起一次请求(secondRequest)。
- A:如果它返回 true,那么你又完成了。如果为假,则启动 processFailed();
现在我已经以一种非常幼稚的方式(和次优的)实现了它:
public void startProcess(){
dataRepository.getStatus()
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(status -> {
if(status){
processCompleted();
} else {
makeFirstRequest();
}
});
}
private void makeFirstRequest(){
dataRepository.firstRequest()
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(status -> {
if(status){
processCompleted();
} else {
makeSecondRequest();
}
});
}
private void makeSecondRequest(){
dataRepository.firstRequest()
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(status -> {
if(status){
processCompleted();
} else {
processFailed();
}
});
}
我想知道如何以更有意义的方式组合这些操作(我查看了 combine
,但我认为这不是预期的用例),并且订阅了三次我认为这是不对的。
我想到了 flatMapping(因为它返回一个 Observable 是有意义的),但是嵌套的操作链(flatMap inside flatMap in flatMap)让我认为必须有一种更简单的方法来使用一些操作符来实现相同的结果。
提前致谢。
最佳答案
flatMap
来拯救:
dataRepository.getStatus()
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.flatMap(status -> status ? Observable.empty() : dataRepository.firstRequest())
.flatMap(status -> status ? Observable.empty() : dataRepository.secondRequest())
.defaultIfEmpty(false)
.subscribe(status -> {
if(status){
processCompleted();
} else {
processFailed();
}
});
您还可以将 Observable.empty
替换为 Observable.just(status)
。
关于android - 仅在特定条件下使用什么 RxJava 运算符来链接可观察对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39526978/