我正在开展一个项目,我的硬件设备通过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);
}
答案 0 :(得分:1)
您可以将侦听器包装在Observable周围,如下所示:
Observable.create(subscriber -> mSerial.addReadListener(
size -> {
byte[] read = mSerial.read(size);
subscriber.onNext(read);
subscriber.add(Subscriptions.create(() -> {
// Remove listener
}));
}));
然后你可以映射这个Observable并从字节数组中获取你需要的任何设备信息。