在不同计算环境下如何避免在订阅中进行订阅

时间:2019-04-18 16:44:37

标签: rx-java reactive-programming rx-java2

我编写了一个程序,该程序从套接字io接收消息,然后播放媒体文件。因此,当程序收到下一条消息时,媒体播放器将停止并播放另一条消息。我将rmarkdown::pdf_document消息流实现为SocketIO,将Observable<String>实现为MediaPlayer。因此,代码包含“订阅中订阅”:

Complatable

也许有办法避免“订阅中订阅”?删除所有可空值并使代码更具“功能性”也很好

更新

似乎class Main { Disposable d = null; public void start() { ScoketIO.connect("localhost:9000").subscribe(event -> { if (d != null) d.dispose(); d = MediaPlayer.play(event).subscribe(); } } } 就是一个简单的例子:

switchMap

新事件到来时,媒体播放器已配置(停止播放)。但是,如果媒体播放器发生故障,则所有链都将失败-套接字连接也将失败,但并非如此。将ScoketIO.connect("localhost:9000") .switchMapCompletable(event -> MediaPlayer.play(event)) .subscribe(); 添加到媒体播放器也会触发重新连接。这是什么意思“不同的计算上下文”。

1 个答案:

答案 0 :(得分:0)

如果您可以在MediaPlayer中构建Completable stop方法,则可以执行以下操作:

        SocketIO.connect("localhost:9000")
                .flatMapCompletable(event ->
                        MediaPlayer.stop()
                                .andThen(MediaPlayer.play(event))
                ).subscribe();