我正在 RxJava/Android 中开发一个完整的应用程序,试图使事情尽可能成为 Rx 方式。
我认为我已经实现了我想要的目标,但现在我遇到了一个问题,我确信存在更好的方法来做到这一点。
它包括:
- 从 Observable 获取布尔值
- A:如果为 true,则完成,返回 true。 B:如果为 false,则发出请求(称为firstRequest)并接收一个 Observable。
- A:同样的,如果是true,就完成了,返回true。 B:如果为假,则发出另一个请求(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 (因为返回一个 Observable 是有意义的),但是嵌套的操作链(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.empty
with Observable.just(status)
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)