如何在不同的计算上下文的情况下避免订阅订阅

问题描述 投票:0回答:1

我写了一个程序,它接收来自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添加到媒体播放器也会触发重新连接。什么意思是“不同的计算环境”。

rx-java reactive-programming rx-java2
1个回答
0
投票

如果您可以在MediaPlayer中构建一个Completable停止方法,您可以:

        SocketIO.connect("localhost:9000")
                .flatMapCompletable(event ->
                        MediaPlayer.stop()
                                .andThen(MediaPlayer.play(event))
                ).subscribe();
© www.soinside.com 2019 - 2024. All rights reserved.