rx-java - 在不同的计算上下文的情况下如何避免订阅订阅
问题描述
我写了一个程序,它从套接字 io 接收消息,然后播放媒体文件。因此,当程序收到下一条消息时,媒体播放器会停止并播放另一个消息。我SocketIO
将消息流实现为Observable<String>
和MediaPlayer
as 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();
当新事件到来时,媒体播放器被释放(停止播放)。但是如果媒体播放器出现故障,所有链都会失败 - 套接字连接也会失败,但事实并非如此。添加retry
到媒体播放器也会触发重新连接。“不同的计算环境”是什么意思。
解决方案
如果您可以在 MediaPlayer 中构建 Completable stop 方法,您可以执行以下操作:
SocketIO.connect("localhost:9000")
.flatMapCompletable(event ->
MediaPlayer.stop()
.andThen(MediaPlayer.play(event))
).subscribe();
推荐阅读
- validation - Laravel 验证 gte 规则
- python - Pycharm:如何构建和安装(在其他计算机上)自定义模块?
- php - 如何计算多维数组中键的数量
- junit - 完成所有 junit 5 测试后如何使用 JdbcTemplate 清理数据库?
- c# - Linux Entity Framework Core 上的 SQL Server 连接字符串无效
- javascript - Webpack + Babel:./_assets/js/src/main.js 模块中的错误未找到
- vba - 在 VBA-ACCESS 中声明 Array() 在没有上限的情况下不起作用
- java - Weblogic“java.lang.IllegalArgumentException:未知的bean状态0”异常
- azure - Azure 上的 DC/OS:自动挂载磁盘
- php - 我的按钮在我使用 ajax 显示后拒绝提交