我正在学习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??
});
但是在订阅中,我不知道如何获取流对象,以保存到对象并显示它。
谢谢!
答案 0 :(得分:1)
最优雅的方法是将流“拆分”为两个。
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`
});