在 RxJava 中使用多个 .subscribe() 语句
Using multiple .subscribe() statements with RxJava
我的 Android BLE 外围设备应用程序写入 2 个不同的设备特征并接收来自其他 2 个设备的通知。 RxAndroidBle
库的开发人员警告不要在同一个 RxBleConnection
实例上进行多个订阅,但我看不到任何将所有这些 I/O 操作组合成一个 .subscribe()
的现实方法],特别是因为其中一个通知是一个非常恒定的数据 "firehose"。
不知道更好,我只是将 RxBleConnection
存储在一个变量中并在多个 .subscribe()
中使用它。据我所知,这一切正常。我调查了 RxAndroidBle
库的 ConnectionSharingAdapter
但是,虽然我分析了代码,但我不明白它比我的简单方法有什么好处(尽管我很想知道)。
一般来说,详细说明多个 .subscribe()
如何引入状态以及潜在的陷阱会有所帮助。问题:
- 将
RxBleConnection
存储在变量中并将其用于多个 .subscribe()
有什么问题?
- 如果这是一个问题,
ConnectionSharingAdapter
是如何解决的?
- 多重订阅是什么意思"introduce state",这怎么会导致问题?
- 是否有任何干净的方法将所有四个特征 I/O 操作合并为一个
.subscribe()
(不会降低性能)?
What is wrong with storing RxBleConnection
in a variable and using it for multiple .subscribe()
s?
(...)
What does it mean to say that multiple subscriptions "introduce state", and how can this cause problems?
这两个问题几乎是一样的。
RxBleConnection
是对状态的抽象,在这种状态下,BLE 客户端与 BLE 服务器交换一些握手数据包,之后客户端和服务器都被视为已连接。不幸的是,由于各种原因,这种连接几乎可以随时中断(而且这种情况经常发生),RxBleConnection
的单个存储变量无法以反应方式轻松表达。
另一方面,一旦连接断开,观察 RxBleDevice.establishConnection()
将向订阅者传播错误。尽管 none 发出的 RxBleConnection
功能在连接断开后仍然有效 - 保存的连接变量在问题发生时不会通知问题。
因此,如果用户将 RxBleConnection
保存到变量 - 它会引入变量可能处于的状态,并且用户负责传播(清除变量)稍后可能发生的错误。相反,订阅 .establishConnection()
将在无法使用连接时发出异常。
许多程序员在实践中可能已经注意到 - 管理状态是应用程序中最常见的错误来源。减少状态是降低错误风险的一种方法。
Jake Wharton 在 Devoxx 发表了精彩(但相当先进)的演讲:Managing State with RxJava by Jake Wharton
If this is a problem, how does ConnectionSharingAdapter
solve it?
由于 BLE 连接和通信的状态特性(请求-响应是一种众所周知的模式),.establishConnection()
observable 不允许同时订阅多个 .subscribe()
使用相同的连接可能会与另一个产生干扰,而代码中没有清晰的痕迹。这就是为什么为不遵循代码中使用 RxBleConnection
的所有位置的用户引入 BleAlreadyConnectedException
的原因。 ConnectionSharingAdapter
是作为有意识地决定在多个交互者之间共享单一连接的用户的助手而引入的。如果 RxBleConnection
损坏,ConnectionSharingAdapter
会将错误传播到所有 Subscriber
。
Is there any clean way of combining all four characteristic I/O operations into a single .subscribe()
(that won't degrade performance)?
在大多数情况下,可以干净地组合许多 I/Os。上面提到的谈话涉及到这个话题。正确组合多个 I/Os 会带来额外分配的成本,但由于此通信通道的低速,在处理 BLE 时这很少成为问题。
我的 Android BLE 外围设备应用程序写入 2 个不同的设备特征并接收来自其他 2 个设备的通知。 RxAndroidBle
库的开发人员警告不要在同一个 RxBleConnection
实例上进行多个订阅,但我看不到任何将所有这些 I/O 操作组合成一个 .subscribe()
的现实方法],特别是因为其中一个通知是一个非常恒定的数据 "firehose"。
不知道更好,我只是将 RxBleConnection
存储在一个变量中并在多个 .subscribe()
中使用它。据我所知,这一切正常。我调查了 RxAndroidBle
库的 ConnectionSharingAdapter
但是,虽然我分析了代码,但我不明白它比我的简单方法有什么好处(尽管我很想知道)。
一般来说,详细说明多个 .subscribe()
如何引入状态以及潜在的陷阱会有所帮助。问题:
- 将
RxBleConnection
存储在变量中并将其用于多个.subscribe()
有什么问题? - 如果这是一个问题,
ConnectionSharingAdapter
是如何解决的? - 多重订阅是什么意思"introduce state",这怎么会导致问题?
- 是否有任何干净的方法将所有四个特征 I/O 操作合并为一个
.subscribe()
(不会降低性能)?
What is wrong with storing
RxBleConnection
in a variable and using it for multiple.subscribe()
s? (...) What does it mean to say that multiple subscriptions "introduce state", and how can this cause problems?
这两个问题几乎是一样的。
RxBleConnection
是对状态的抽象,在这种状态下,BLE 客户端与 BLE 服务器交换一些握手数据包,之后客户端和服务器都被视为已连接。不幸的是,由于各种原因,这种连接几乎可以随时中断(而且这种情况经常发生),RxBleConnection
的单个存储变量无法以反应方式轻松表达。
另一方面,一旦连接断开,观察 RxBleDevice.establishConnection()
将向订阅者传播错误。尽管 none 发出的 RxBleConnection
功能在连接断开后仍然有效 - 保存的连接变量在问题发生时不会通知问题。
因此,如果用户将 RxBleConnection
保存到变量 - 它会引入变量可能处于的状态,并且用户负责传播(清除变量)稍后可能发生的错误。相反,订阅 .establishConnection()
将在无法使用连接时发出异常。
许多程序员在实践中可能已经注意到 - 管理状态是应用程序中最常见的错误来源。减少状态是降低错误风险的一种方法。
Jake Wharton 在 Devoxx 发表了精彩(但相当先进)的演讲:Managing State with RxJava by Jake Wharton
If this is a problem, how does
ConnectionSharingAdapter
solve it?
由于 BLE 连接和通信的状态特性(请求-响应是一种众所周知的模式),.establishConnection()
observable 不允许同时订阅多个 .subscribe()
使用相同的连接可能会与另一个产生干扰,而代码中没有清晰的痕迹。这就是为什么为不遵循代码中使用 RxBleConnection
的所有位置的用户引入 BleAlreadyConnectedException
的原因。 ConnectionSharingAdapter
是作为有意识地决定在多个交互者之间共享单一连接的用户的助手而引入的。如果 RxBleConnection
损坏,ConnectionSharingAdapter
会将错误传播到所有 Subscriber
。
Is there any clean way of combining all four characteristic I/O operations into a single
.subscribe()
(that won't degrade performance)?
在大多数情况下,可以干净地组合许多 I/Os。上面提到的谈话涉及到这个话题。正确组合多个 I/Os 会带来额外分配的成本,但由于此通信通道的低速,在处理 BLE 时这很少成为问题。