根据上一个API调用的结果进行RxJava调用的最佳方法

时间:2020-01-13 14:13:19

标签: android retrofit2 rx-java2

我正在做一个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));
}

这一切正常,但是我在第二个订阅上收到“未使用订阅结果”的棉绒警告。我没有合并两个电话的结果。我真的可以使用一些指导。

2 个答案:

答案 0 :(得分:0)

使用flatMap()代替onNext()。您会收到有关第二次订阅的“未使用订阅结果”的警告。 flatMap()应该有所帮助。

read this首先和其他RxJava文档

答案 1 :(得分:0)

print (df.set_index('id') .fillna('s,g,r') .stack() .str.split(',|;', expand=True) .stack() .str.split(':', expand=True) .reset_index(level=2, drop=True) .set_index(0, append=True)[1] .unstack()) 0 g r s id 0 c1 B 2 1 c2 A 3 2 c3 C 4 1 c4 D 2 3 1 c1 None None None c2 E 4 2 c3 C 3 3 c4 F 3 3 是一个副作用运算符。您正在做什么:

<Route
  path='/dashboard'
  render={(props) => <Dashboard {...props} isAuthed={true} />}
/>

只会创建一个一次性的。这种一次性物品不会成为潮流的一部分。还要注意,.doOnNext流现在将完全独立运行,因为正如我刚才所说, timingObservable .subscribeOn(Schedulers.io()) .doOnError(Timber::e) .subscribe(timing -> {episodeManager.saveTiming(timing);}); 是一个副作用运算符。您正在做的是一劳永逸的电话。要将响应作为流的一部分,请使用。timingObservable代替。doOnNext。它将合并您的响应,并将其推送给下游操作员。

理想情况下,反应流只应订阅一次-您要进行两次。这是立即的代码气味。

相关问题