我目前的代码如下所示。我想知道如何在writeCharacteristic之后取消订阅(断开连接)?另外,有没有办法重新连接writeCharacteristic失败?
Subscription subscription = device.establishConnection(false)
.timeout(5000, TimeUnit.MILLISECONDS)
.flatMap(rxBleConnection ->
rxBleConnection.writeCharacteristic(fromString("00005551-0000-1000-8000-008055555fb"), hexToBytes(mData)))
.take(1).retry(2)
.subscribe(
characteristicValue -> {
Log.e(TAG, "write success " + characteristicValue + " " + device.getMacAddress());
// subscribeList.remove(key).unsubscribe();
},
throwable -> {
Log.e(TAG, "write error " + throwable);
// subscribeList.remove(key).unsubscribe();
}
);
答案 0 :(得分:1)
我想知道如何在连接后取消订阅(断开连接)?
我假设after connection
是after the write
因为如果连接因外部因素而结束(如外围设备被关闭)那么整个流程将以错误结束。
如果您只想写一个值然后断开连接,那么您需要的一切就是在writeCharacteristic()
之后使用.take(1)
之前的.subscribe()
从流中获取单个值。< / p>
另外,有没有办法在writeCharacteristic上重新连接失败?
首先,如果错误与写入本身有关,则rxBleConnection.writeCharacteristic()
的失败不会自动关闭自{1.3}版本的RxAndroidBle
以来的连接。
您可能遇到的连接只是因为您没有处理写入操作的错误而被关闭。您可以使用.retry(2)
运算符使写入重试两次。
请注意Observable
尝试.retry()
.retry()
。如果您有兴趣仅在失败时重试写入但连接仍然有效,那么您应该在RxBleConnection.writeCharacteristic()
上应用.retry()
。另一方面 - 如果您想要在发生任何错误时重试整个流程,那么您应该将Observable
放在整个流Subscription subscription = device.establishConnection(false)
.flatMap(rxBleConnection ->
rxBleConnection.writeCharacteristic(
fromString("00005551-0000-1000-8000-008055555fb"),
hexToBytes(mData)
)
.retry(2) // retry here will only retry the write if a write characteristic will fail but the connection will still be intact
)
.take(1) // this will unsubscribe the above part of the Observable on the first valid emission from it—so after the write will complete
// .retry(2) if you will put retry here then for whatever reason the above flow [connecting + writing] will fail then a new connection will be established and write performed
.subscribe(
characteristicValue -> {
Log.e(TAG, "write success " + characteristicValue + " " + device.getMacAddress());
},
throwable -> {
Log.e(TAG, "write error " + throwable);
}
);
上。
site_url("/Admin/addPerson/username/password/accesslevel")
答案 1 :(得分:0)
只需:
subscription.unsubscribe();
如果我正确理解了这个过程,那么取消订阅将会“冒泡”#34;通过操作员堆栈到顶部,从而断开连接。