为什么它不能应用flatmap并在相同的RxBleConnection observable上订阅两次?

时间:2017-06-19 04:47:54

标签: rx-java rx-android rxandroidble

作为标题,

为简单起见,如果我想用不同 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)==&gt; device.establishConnection(false).compose(new ConnectionSharingAdapter())

ConnectionSharingAdapter将执行以下操作:

sourceObservable.replay(1).refCount();

保持源可观察的最后一个发射

1 个答案:

答案 0 :(得分:0)

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