Как избежать подписки в подписке в случае различных вычислительных контекстов - PullRequest
0 голосов
/ 18 апреля 2019

Я написал программу, которая получает сообщения от сокета 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();
        }
    }
}

Может быть, есть способ избежать «подписаться в подписке»?Также хорошо удалить все обнуляемые значения и сделать код более «функциональным»1017 * медиаплеер утилизируется (прекращается воспроизведение) при появлении нового события.Но в случае сбоя в медиаплеере произойдет сбой всей цепочки - сокетное соединение тоже, но это не так.Добавление retry в медиаплеер также вызывает переподключение.Что означает «разные вычислительные контексты».

1 Ответ

0 голосов
/ 19 апреля 2019

Если вы можете создать метод Completable stop в MediaPlayer, вы можете сделать:

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