我写了一个程序,它接收来自socket io的消息,然后播放媒体文件。因此,当程序收到下一条消息时,媒体播放器会停止播放我将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();
}
}
}
也许有办法避免“订阅订阅”?也很好删除所有的nullables并使代码更“功能”
UPD
似乎switchMap
为这个简单的例子工作:
ScoketIO.connect("localhost:9000")
.switchMapCompletable(event -> MediaPlayer.play(event))
.subscribe();
新活动到来时媒体播放器处理(停止播放)但是如果媒体播放器出现故障,所有链都会失败 - 套接字连接也会失败,但事实并非如此。将retry
添加到媒体播放器也会触发重新连接。什么意思是“不同的计算环境”。
如果您可以在MediaPlayer中构建一个Completable停止方法,您可以:
SocketIO.connect("localhost:9000")
.flatMapCompletable(event ->
MediaPlayer.stop()
.andThen(MediaPlayer.play(event))
).subscribe();