用RxAndroidBle编写多个特征的正确方法是什么?
我是Rx的新手,仍在努力弄清楚如何正确处理观察对象。我想知道是否有更好的方法来编写多个特性,而不是使用RxAndroidBle一次完成一个特性?目前,我一次只做一个,代码如下。用RxAndroidBle编写多个特征的正确方法是什么?
Observable<RxBleConnection> mConnectionObservable;
private void saveChanges(String serialNumber, Date date, MachineTypeEnum machineType, MachineConfig machineConfig) {
mWriteSubscription = mConnectionObservable
.flatMap(rxBleConnection -> Observable.merge(
getWrites(rxBleConnection, serialNumber, machineType, machineConfig, date)
))
.observeOn(AndroidSchedulers.mainThread())
.subscribe(bytes -> {
Toast.makeText(getContext(), "Saved Changes", Toast.LENGTH_SHORT).show();
((MainActivity)getActivity()).back();
}, BleUtil::logError);
}
private Iterable<? extends Observable<? extends byte[]>> getWrites(RxBleConnection rxBleConnection,
String serialNumber,
MachineTypeEnum machineType,
MachineConfig machineConfig,
Date date) {
List<Observable<byte[]>> observables = new ArrayList<>();
observables.add(rxBleConnection.writeCharacteristic(
Constants.Bluetooth.Services.DrainCleaner.Characteristics.UUID_WRITE_SERIAL_NUMBER,
Utf8Util.nullPad(serialNumber, 16).getBytes()).doOnError(throwable -> Log.e("Write", "serial failed", throwable)));
observables.add(rxBleConnection.writeCharacteristic(
Constants.Bluetooth.Services.DrainCleaner.Characteristics.UUID_MACHINE_TYPE,
new byte[]{(byte) machineType.val()}).doOnError(throwable -> Log.e("Write", "machine type failed", throwable)));
observables.add(rxBleConnection.writeCharacteristic(
Constants.Bluetooth.Services.DrainCleaner.Characteristics.UUID_CHARACTERISTIC,
MachineConfigBitLogic.toBytes(machineConfig)).doOnError(throwable -> Log.e("Write", "machine config failed", throwable)));
observables.add(rxBleConnection.writeCharacteristic(
Constants.Bluetooth.Services.CurrentTime.Characteristics.UUID_CURRENT_TIME,
TimeBitLogic.bytesFor(date)).doOnError(throwable -> Log.e("Write", "date failed", throwable)));
return observables;
}
因此,我改变了我的旧代码,现在使用合并,但只有一个特性现在似乎更新。
我会用merge操作:
mConnectionObservable
.flatMap(rxBleConnection ->
Observable.merge(
rxBleConnection.writeCharacteristic(
Constants.Bluetooth.Services.DeviceInformation.Characteristics.UUID_SERIAL_NUMBER,
Utf8Util.nullPad(serialNumber, 16).getBytes()
),
rxBleConnection.writeCharacteristic(
Constants.Bluetooth.Services.DrainCleaner.Characteristics.UUID_MACHINE_TYPE,
new byte[]{(byte) machineType.val()}
))
.subscribe(bytes -> {/* do something*/}, BleUtil::logError);
你也可以通过观测到运营商的列表:
而是通过多个观测量(最多9个)为合并的,你 也可以传递一个List(或其他Iterable)的Observable,一个 Observable数组,或者甚至可以传出Observable的Observable, 并且合并会将它们的输出合并到输出中单 可观察
的RxAndroidBle
库序列化引擎盖下的任何BLE请求在Android上进行BLE实现主要是同步的(虽然Android的香草API表明它不是)。
的写入Mergeing是一个很好的方法,虽然你需要知道的合并运营商做什么:
* You can combine the items emitted by multiple Observables so that they appear as a single Observable, by
* using the {@code merge} method.
所以我改变了我的旧代码,以高于自己现在使用合并,但只其中一个特征现在似乎更新了。
其原因行为可能是你如何消费流:
.subscribe(bytes -> {
Toast.makeText(getContext(), "Saved Changes", Toast.LENGTH_SHORT).show();
((MainActivity)getActivity()).back();
}, BleUtil::logError);
每当bytes
发射您呼叫Activity.back()
。 .merge()
对于执行的每个写入命令,操作员都会发出bytes
。如果您退订Subscription
即.onPause()
,那么在第一次写入完成后它将立即取消订阅。 你可以让你的流程等待,直到所有的写入都像这样完成:
private void saveChanges(String serialNumber, Date date, MachineTypeEnum machineType, MachineConfig machineConfig) {
mWriteSubscription = mConnectionObservable
.flatMap(rxBleConnection ->
Observable.merge(
getWrites(rxBleConnection, serialNumber, machineType, machineConfig, date)
)
.toCompletable() // we are only interested in the merged writes completion
.andThen(Observable.just(new byte[0])) // once the merged writes complete we send a single value that will be reacted upon (ignored) in .subscribe()
)
.observeOn(AndroidSchedulers.mainThread())
.subscribe(ignored -> {
Toast.makeText(getContext(), "Saved Changes", Toast.LENGTH_SHORT).show();
((MainActivity)getActivity()).back();
}, BleUtil::logError);
}
感谢您的帮助!它现在按预期工作! –
虽然我遇到了使用合并的问题。这似乎只有一个特点被写入这种方法。我将使用当前的代码添加编辑。 –
看起来像其中一个observables抛出一个错误。 –