java - 如何组合相互依赖的 Observables 并获得一个包含每个值的对象?

标签 java android rx-java2

我正在学习 RxJava,并且想知道如何解决这个问题: 我正在使用 Twitch API,我想获取流,并为每个流获取其游戏,最后保存在一个对象中并显示它。

这是我的代码:

twitchAPI.getStreamsObservable(TwitchAPI.CLIENT_ID)
                .flatMap(twitchStreams -> Observable.fromIterable(twitchStreams.getStreamList()))
                .filter(Stream -> Stream.getViewerCount() > 10000)
.subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(stream -> {
                    StreamMostViewed streamMostViewed = new StreamMostViewed();
                    streamMostViewed.setStreamName(stream.getTitle());
                    twitchAPI.getGame(stream.getGameId(), TwitchAPI.CLIENT_ID)
                            .subscribeOn(Schedulers.io())
                            .observeOn(AndroidSchedulers.mainThread())
                            .subscribe(game -> {
                                streamMostViewed.setGameName(game.getName());
                                view.showStream(streamMostViewed);
                            });
                });

问题是,首先,它获取所有流,然后获取游戏,但所有这些都是空的...

我的另一个解决方案是:

twitchAPI.getStreamsObservable(TwitchAPI.CLIENT_ID)
                .flatMap(twitchStreams -> Observable.fromIterable(twitchStreams.getStreamList()))
                .filter(Stream -> Stream.getViewerCount() > 10000)
 .flatMap(stream -> twitchAPI.getGame(stream.getGameId(),TwitchAPI.CLIENT_ID))
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(game -> {
                    game.getName();
//How could I get the stream object??
                });

但在订阅中我不知道如何获取流对象,以便保存在对象中并显示它。

谢谢!!

最佳答案

最优雅的方式是将流“拆分”为两部分。

streams = twitchAPI.getStreamsObservable(TwitchAPI.CLIENT_ID)
            .flatMap(twitchStreams -> Observable.fromIterable(twitchStreams.getStreamList()))
            .filter(Stream -> Stream.getViewerCount() > 10000)
            .replay()
            .autoConnect(2);

第一次订阅:

streams.subscribeOn(Schedulers.io())
        .observeOn(AndroidSchedulers.mainThread())
        .subscribe(stream -> {
            // handle `stream`
        });

第二次订阅。

streams.flatMap(stream -> twitchAPI.getGame(stream.getGameId(),TwitchAPI.CLIENT_ID))
        .subscribeOn(Schedulers.io())
        .observeOn(AndroidSchedulers.mainThread())
        .subscribe(game -> {
            // do something with the `game`
        });

关于java - 如何组合相互依赖的 Observables 并获得一个包含每个值的对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56698734/

相关文章:

java - 如何以编程方式让 Android 进入待机状态?

java - 寻找 Rxjava 运算符将源合并到一个流中

java - 如何在 Maybe.create(emitter) 中发出 Maybe.empty ?

android - RxJava2 将 Flowable 转换为 Single

java - Log4j 多个 Web 应用程序的通用日志文件?

java - 如何 : Split while loop with double comparisson into two?

Android 深层链接不适用于 Gmail

java - 我应该使用哪个集合(键 - 值)?

java - 2 个关于 RESTful Web 服务的问题

java - JVM 性能指标