我正在做一个项目,我有一个硬件设备通过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,并从字节数组中获取你需要的任何设备信息。