我正在开发一个完整的RxJava/Android应用程序,试图使事情尽可能的rx方式。
我认为我达到了我想要的,但现在我遇到了一个问题,我确信存在一个更好的方法来做到这一点。它包括:
- 从Observable中获取布尔值
- A:如果为真,则完成,返回真。B:如果是false,发出一个请求(调用它为firstquest)并接收一个Observable。
- A:同样的,如果为真,则完成,返回真。B:如果是false,则重新请求(secondRequest)。
- A:如果它返回true,那么你就完成了。如果为false,则启动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(因为它有意义返回一个可观察对象),但是嵌套的操作链(flatMap在flatMap中在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.just(status)
代替Observable.empty
。