简体   繁体   English

如何组合相互依赖的 Observables 并从每个对象中获取一个包含值的对象?

[英]How to combine Observables which depends each other and get an object that contain a value from each?

I´m learning RxJava and a would like to know how to resolve this problem: I´m using Twitch API, and a would like to get the streams, and for each stream get its game, and save in an object finally and show it.我正在学习 RxJava 并且想知道如何解决这个问题:我正在使用 Twitch API,并且想获取流,并为每个流获取其游戏,最后保存在一个对象中并显示它.

This is my code:这是我的代码:

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);
                            });
                });

The problem is that in first place, it gets all streams, and then, gets the games, but all of them are null...问题是,首先,它获取所有流,然后获取游戏,但所有这些都是空的......

My other solution was:我的另一个解决方案是:

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??
                });

But in the subscribe I don´t know how get the stream object, for save in a object and show it.但是在订阅中我不知道如何获取流对象,以便保存在一个对象中并显示它。

Thank you!!谢谢!!

The most elegant way would be to "split" the stream into two.最优雅的方法是将流“拆分”为两部分。

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

First subscription:第一次订阅:

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

Second subscription.第二次订阅。

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM