我正在使用RxJava / Android开发一个完整的应用程序,试图让这些东西成为最可能的Rx方式。
我认为我实现了我想要的目标,但现在我遇到了一个问题,我确信这是一个更好的方法。 它包括:
现在我以一种非常天真的方式实现它(并且次优):
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里面的flatMap里面的flatMap)让我觉得必须有一种更简单的方法来实现与某些运算符相同的结果。
提前致谢。
答案 0 :(得分:7)
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)
。