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

时间:2015-07-14 05:31:45

标签: android system.reactive rx-java observable rx-android

我正在开展一个项目,我的硬件设备通过USB线与我的Android应用程序通信。包含在瘦序列化层中的协议缓冲区是我的通信协议。

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

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

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

这里的诀窍是:填写DeviceInfo需要5次来回异步调用(不是我的设计),只要应用程序处于打开状态,DeviceState就会继续从硬件发送。

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

我的问题:有没有办法在不使用Subjects作为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);
}

1 个答案:

答案 0 :(得分:1)

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

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

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

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