0

如题,

为简单起见,如果我想使用不同的UUID 执行两次读取操作:

(我知道 RxAndroidBle 提供了多次读取功能)

Observable<RxBleConnection> ob = device.establishConnection(false);

ob.flatMap(rxBleConnection -> rxBleConnection.readCharacteristic(CHAR_WIFI_SSID))
        .subscribe(
                characteristicValue -> {
                    //2. then read Successfully here !!!!!
                },
                throwable -> {
                }
        );

ob.flatMap(rxBleConnection -> rxBleConnection.readCharacteristic(CHAR_WIFI_SECURITY_MODE))
        .subscribe(
                characteristicValue -> {     
                },
                throwable -> {
                    //1. I got BleAlreadyConnectedException error first !!!!
                }
        );

为什么第二个 subscribe() 得到 BleAlreadyConnectedException ?

==========更新==========

我找到了解决方案,如果我修改

device.establishConnection(false) ==> device.establishConnection(false).compose(new ConnectionSharingAdapter())

ConnectionSharingAdapter 会做这样的事情:

sourceObservable.replay(1).refCount();

保持 source observable 发出的最后一个

4

1 回答 1

0

两次订阅同一个Observable将调用订阅逻辑两次,这在某些情况下可能是多余的,或者像您的情况一样有问题,您正在建立与 Ble 的多个连接,这是被禁止的并获得BleAlreadyConnectedException.
正如徐院长指出的那样,您应该多播您的Observable以防止这种情况发生。(您可以使用各种发布/共享运算符)

于 2017-06-19T06:13:07.533 回答