我有一系列对互联网、数据库的调用,结果我向用户显示了收集到的信息。现在我有非常丑陋的 3 级嵌套 RxJava 流。我真的想让它流畅易读,但我一直很努力。
我已经阅读了有关 Map、flatMap、zip 等的所有内容。无法让它们协同工作。
代码:调用api。在第一个流的 onSuccess 方法中接收到的信息放入数据库订阅另一个流,在第二个流的 onSuccess 方法中从数据库信息接收最终显示给用户。
科学怪人:
disposables.add(modelManager.apiCall()
.subscribeOn(Schedulers.io())
.observeOn(mainThread)
.subscribeWith(new DisposableSingleObserver {
public void onSuccess(ApiResponse apiResponse) {
modelManager.storeInDatabase(apiResponse)
//level 1 nested stream:
disposables.add(modelManager.loadFromDatabas()
.subscribeOn(Schedulers.io())
.observeOn(mainThread)
.subscribeWith(new DisposableSingleObserver{
public void onSuccess(Data data) {
view.showData(data);
}
public void onError(Throwable e) {
}
}));
}
@Override
public void onError(Throwable e) {
}
}));
}
最佳答案
I already read everything about Map, flatMap, zip, etc. Cant' make things work together.
好吧,你错过了关于 flatMap
的一些 ,因为这就是它的用途;)
disposables.add(
modelManager.apiCall()
.subscribeOn(Schedulers.io())
.doOnSuccess((apiResponse) -> {
modelManager.storeInDatabase(apiResponse)
})
.flatMap((apiResponse) -> {
modelManager.loadFromDatabase()
})
.observeOn(AndroidSchedulers.mainThread())
.subscribe((data) -> {
view.showData(data);
})
);
但是如果你使用像 Room 的 LiveData<List<T>>
这样的响应式(Reactive)数据库层支持,那么你实际上可以放弃 modelManager.loadFromDatabase()
部分。
关于java - 如何摆脱嵌套的 RxJava 流?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55560124/