我接到互联网,数据库的电话,结果我向用户显示了收集的信息。现在,我有非常丑陋的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) {
}
}));
}
答案 0 :(得分:3)
我已经阅读了有关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);
})
);
但是,如果您使用反应性数据库层(例如Room的LiveData<List<T>>
支持),则实际上可以放弃modelManager.loadFromDatabase()
部分。
答案 1 :(得分:2)
b
意味着将一个流的结果转换为另一个流,这很可能是您想要的。
因为您有一个false
会发出一个flatMap
,所以您还有另一个“ Observable
s的源”,它将这个ApiResponse
并给出另一个Observable
您想观察的地方。
所以您可能想要这样的东西:
ApiResponse