0

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

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

我对此类 + 服务的公共 API 是 2 个 Observables:

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

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

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

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

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

1 回答 1

1

您可以将侦听器包裹在 Observable 周围,如下所示:

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

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

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

于 2015-07-14T08:06:58.140 回答