如何用RXJava和无对象的可观察对象抽象硬件



我正在做一个项目,我有一个硬件设备通过USB线与我的Android应用程序对话。协议缓冲区,封装在一个薄序列化层是我的通信协议。

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

这个类+服务的公共API是2个可观察对象:

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

这里有一个技巧:填充DeviceInfo需要5个来回的异步调用(不是我的设计),只要应用程序打开,DeviceState就会一直从硬件发送上来。

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

我的问题:有没有一种方法可以做到这一点,而不使用主题作为后台存储的DeviceInfo和DeviceState?我一直在阅读关于邪恶主体的文章,虽然我不相信它们是邪恶的(然而,它们不一定是"功能性的"),但这似乎是我无法控制的外部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,并从字节数组中获取你需要的任何设备信息。

相关内容

  • 没有找到相关文章

最新更新