如何使用 RXJava 和没有主题的 Observables 抽象出硬件?

How to abstract away hardware with RXJava and Observables without Subjects?

我正在做一个项目,我有一个硬件设备通过 USB 电缆与我的 Android 应用程序通信。包裹在薄序列化层中的协议缓冲区是我的通信协议。

目前,USB 通信使用监视 USB 的异步侦听器进行。从这里,我读取了来自我的硬件的字节,对它们进行操作(例如反序列化它们,打开 protobuf 等......),并适当地设置任何成员变量等。

我的 public API 到这个 class + 服务是 2 个 Observables:

Observable<DeviceInfo> getDeviceInfoObservable() 
Observable<DeviceState> getDeviceStateObservable()

诀窍是:填充 DeviceInfo 需要 5 次来回异步调用(不是我的设计),只要应用程序打开,DeviceState 就会不断从硬件发送。

对于设备信息,我等到所有 5 个都准备就绪,然后通知我的观察者(我知道我可以进行订阅者端过滤,但我宁愿推送一个完全准备好的 DeviceInfo),对于状态,我只是在收到它们时推送它们。

我的问题:有没有办法在不使用 Subjects 作为 DeviceInfo 和 DeviceState 的后备存储的情况下做到这一点?我一直在阅读有关 Subject 有多邪恶的信息,虽然我不相信它们是邪恶的(但是,它们不一定 'functional'),这似乎是我无法控制的外部 IO 的一个很好的用途.

mSerial.addReadListener(size -> {
  byte[] data = mSerial.read(size);
  // extract data into something usable
  ...
  if (mDeviceInfo.isReady()) {
    mInfoSubject.onNext(mDeviceInfo);
  }
  ...
  mSubject.onNext(mDeviceState);
}

你可以将你的监听器包裹在 Observable 周围,像这样:

Observable.create(subscriber -> mSerial.addReadListener(
        size -> {
            byte[] read = mSerial.read(size);
            subscriber.onNext(read);

            subscriber.add(Subscriptions.create(() -> {
                // Remove listener
            }));
        }));

然后你可以映射这个 Observable 并从字节数组中获取你需要的任何设备信息。