我正在执行API调用以获取程序播客的描述,并且根据播客的类型,我可能必须也可能不必执行另一个API调用来获取更多信息。 我是 RxJava 的新手,我不确定进行此类调用的最佳方式。 这是我到目前为止所拥有的:
public void fetchFeaturedItems() {
Timber.i("Fetching Featured...");
disposables.add(episodeService.getFeatured()
.subscribeOn(Schedulers.io())
.doOnNext(featured -> { //make second call
final Episode episode = featured.getEpisode();
Observable<Timing> timingObservable = episodeService.getTimingForEpisodeActs(episode);
if (timingObservable != null) {
timingObservable
.subscribeOn(Schedulers.io())
.doOnError(Timber::e)
.subscribe(timing -> {episodeManager.saveTiming(timing);}); //save to database
}
})
.observeOn(Schedulers.io())
.subscribe(featured -> {
saveFeatured(featured);
final Episode episode = featured.getEpisode();
notificationManager.handleNewEpisodeNotification(episode);
}, Timber::e));
}
这一切都有效,但我在第二次订阅时收到"未使用订阅结果"lint 警告。 我没有合并两个调用的结果。 我真的可以使用一些指导。
使用 flatMap(( 而不是 onNext((。您会收到有关"未使用订阅结果"的警告,原因是第二次订阅。flatMap(( 应该会有所帮助。
首先阅读此文档和其他 RxJava 文档
.doOnNext
是一个副作用运算符。你在做什么:
timingObservable
.subscribeOn(Schedulers.io())
.doOnError(Timber::e)
.subscribe(timing -> {episodeManager.saveTiming(timing);});
只会创建一个一次性用品。这种一次性产品不会成为流的一部分。另请注意,timingObservable
流现在将完全独立运行,因为正如我刚才所说,doOnNext
是一个副作用运算符。你正在做的是一个即发即劳的电话。要将响应作为流的一部分,请使用 .flatMap
代替 。doOnNext
.它会合并您的响应,并将其推送给下游运营商。
理想情况下,反应式流应该只订阅一次 - 你正在订阅两次。这是一种即时代码异味。