Rx java 为什么可以';它不应用flatmap并订阅同一个RxBleConnection可观察两次吗?

Rx java 为什么可以';它不应用flatmap并订阅同一个RxBleConnection可观察两次吗?,rx-java,rx-android,rxandroidble,Rx Java,Rx Android,Rxandroidble,作为标题 为简单起见,如果我想使用不同的UUID执行两次读取操作: (我知道RxAndroidBle提供了多重读取功能) ob=设备连接(假); ob.flatMap(rxBleConnection->rxBleConnection.readCharacteristic(CHAR\u WIFI\u SSID)) .订阅( 特征值->{ //2.然后在这里成功阅读!!!!! }, 可丢弃->{ } ); ob.flatMap(rxBleConnection->rxBleConnection.rea

作为标题

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

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

ob=设备连接(假);
ob.flatMap(rxBleConnection->rxBleConnection.readCharacteristic(CHAR\u WIFI\u SSID))
.订阅(
特征值->{
//2.然后在这里成功阅读!!!!!
},
可丢弃->{
}
);
ob.flatMap(rxBleConnection->rxBleConnection.readCharacteristic(CHAR\u WIFI\u SECURITY\u MODE))
.订阅(
特征值->{
},
可丢弃->{
//1.我首先得到了BleAlreadyConnectedException错误!!!!
}
);
为什么第二个subscribe()会得到blealReadyConnectionedException

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

我找到了解决办法, 如果我修改

设备连接(错误)==> device.establishConnection(false).compose(新连接共享适配器())

ConnectionShareingAdapter将执行以下操作:

sourceObservable.replay(1.refCount()


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

订阅两次相同的
可观察
将调用订阅逻辑两次,这在某些情况下可能是冗余的,或者像您的情况一样出现故障,您正在建立多个到Ble的连接,这是被禁止的,并且得到了
blalReadyConnectionException


正如徐院长指出的,你应该多播你的
可观察的
,以防止这种情况发生。(您可以使用各种发布/共享操作符)

我不知道rxandroidble。但是我想你想要的是
可观察的。分享
。我想我找到了问题所在。这是令人沮丧的连接异常…也许我必须改变我的问题。。。因为我读了不同的UUID,所以有两个不同的主题。事实并非如此:同一主题和多个观察者我不确定我是否理解您的意思,但问题是多个
设备。建立连接
,您可以读取2个不同的UUID,它只是连接本身,无法创建两次,因此您需要多播连接,然后从同一个连接创建两个独立的主题。我只调用了一次device.establishConnection(),所以我不知道为什么会出现这种异常…看来您在编辑时对答案应用了解决方案,无论如何,
device.establishConnection()
只是创建了可观察对象,而没有执行实际的连接,订阅时,执行可观察订阅逻辑,订阅两次,执行两次感谢您的解释,我还做了一些测试,ob=buildConnection(false).publish(),后跟ob.connect(),然后调用两次ob.flatMap().subscribe(),没问题,没有任何错误。。。
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 !!!!
                }
        );