java - 如何摆脱嵌套的 RxJava 流?
问题描述
我有一系列对互联网、数据库的调用,结果我向用户显示收集的信息。现在我有非常难看的 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) {
}
}));
}
解决方案
我已经阅读了有关 Map、flatMap、zip 等的所有内容。不能让事情协同工作。
好吧,你错过了一些关于的东西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);
})
);
但是,如果您使用像 RoomLiveData<List<T>>
支持这样的反应式数据库层,那么您实际上可以放弃该modelManager.loadFromDatabase()
部分。
推荐阅读
- powerbi - 日期表关系
- python-3.x - 网址错误:
使用 request.urlretrieve - javascript - 从数据库返回数据
- java - LibGDX 相机旋转问题
- javascript - JavaScript:从 JSON 数组中获取元素
- java - 为什么我需要转换 myCollection.toArray(new String[0]) 的结果
- windows - PowerShell 会话中的字符编码 (UTF-8)
- swift - Vapor 部署 -> 错误:找不到存储库
- c# - 将泛型类转换为其继承类
- javascript - JavaScript 函数以 JSON 形式返回对象