Проблемы с отпиской
Я делаю приложение, которое работает как пульт дистанционного управления для вентилятора с помощью RxAndroidBle. У меня проблема с unsubscribe
потому что когда я использую
.flatMap(rxBleConnection -> rxBleConnection.writeCharacteristic(Uuids.UUID_RX, flaktCommandConcat.getBytes()))
и после этого я использую subscription.unsubscribe();
writeCharacteristics не работает, потому что unsubscribe
всегда запускается всегда, и соединение разрывается до отправки данных.
Что мне нужно это:
- Когда я нажимаю кнопку, я хочу подключиться к вентилятору
- Затем отправьте все значения
- А потом отключи.
- Если я повторю процедуру, ей придется делать одно и то же снова и снова.
Может ли кто-нибудь помочь мне с какой-то идеей? Я пытался использовать .delay(1000, Time.MILISECONDS)
и это сработало, но потребовалось много времени, чтобы отправить информацию на аппарат ИВЛ.
Это мой код:
public void writeRxCharacteristics(String flaktCommandConcat){
rxBleDevice = rxBleClient.getBleDevice(Uuids.DEVICE_ADDRESS);
subscription = rxBleDevice.establishConnection(true) //false
.observeOn(AndroidSchedulers.mainThread())
.flatMap(rxBleConnection -> rxBleConnection.createNewLongWriteBuilder()
.setCharacteristicUuid(Uuids.UUID_RX)
.setBytes(flaktCommandConcat.getBytes())
.build())
.subscribe(
byteArray -> {
Log.d("CharacteristicValue","WRITE: " + Arrays.toString(byteArray));
},
throwable -> {
Log.d("CharacteristicValue","Throwable: " + throwable.toString());
rxBleActivity.onScanFailure(throwable, getContext());
}
);
rxBleDevice.observeConnectionStateChanges()
.observeOn(AndroidSchedulers.mainThread())
.delay(1000, TimeUnit.MILLISECONDS)
.subscribe(
rxBleConnectionState -> {
Log.d("RxBleConnectionState", " CON_STATUS: " + rxBleConnectionState);
disconnect();
},
throwable -> {
Log.d("ConnectionStateChanges","Throwable: " + throwable.toString());
}
);
}
public void disconnect() {
if (subscription != null && !subscription.isUnsubscribed()) {
subscription.unsubscribe();
subscription = null;
}
Log.d("CONNECTION2", " CON_STATUS: " + rxBleDevice.getConnectionState().toString());
}
1 ответ
Похоже, вам не нужно долго писать здесь. Ваши данные длиннее 20 байт?
В любом случае, библиотека освобождает соединение, когда Observable<RxBleConnection>
отписался Что бы я сделал на вашем месте, это:
public void writeRxCharacteristics(String flaktCommandConcat){
rxBleDevice = rxBleClient.getBleDevice(Uuids.DEVICE_ADDRESS);
rxBleDevice.establishConnection(true) //false
.flatMap(rxBleConnection -> rxBleConnection.createNewLongWriteBuilder()
.setCharacteristicUuid(Uuids.UUID_RX)
.setBytes(flaktCommandConcat.getBytes())
.build()
)
.take(1)
.observeOn(AndroidSchedulers.mainThread())
.subscribe(
byteArray -> {
Log.d("CharacteristicValue","WRITE: " + Arrays.toString(byteArray));
},
throwable -> {
Log.d("CharacteristicValue","Throwable: " + throwable.toString());
rxBleActivity.onScanFailure(throwable, getContext());
}
);
Пожалуйста, убедитесь, что вы не злоупотребляете длинной записью. У него есть известная ошибка (не связанная) в 1.2.0, которая недавно была исправлена в 1.3.0-SNAPSHOT.