Почему он не может применить плоскую карту и дважды подписаться на один и тот же наблюдаемый RxBleConnection?

Как название,

Для простоты, если я хочу дважды выполнить операцию чтения с другим 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.installConnection(false) ==> device.installConnection(false).compose(new ConnectionSharingAdapter())

ConnectionSharingAdapter сделает что-то вроде этого:

sourceObservable.replay(1).refCount();

сохранить последний излучаемый источником наблюдаемым


person 楊舜淼    schedule 19.06.2017    source источник
comment
Я не знаю rxandroidble. Но я думаю, что вы хотите Observable.share.   -  person Dean Xu    schedule 19.06.2017
comment
Я думаю, что нашел проблему. Это BleAlreadyConnectedException...   -  person 楊舜淼    schedule 19.06.2017


Ответы (1)


Подписка дважды на один и тот же Observable вызовет логику подписки дважды, что в некоторых случаях может быть избыточным или ошибочным, как в вашем случае, когда вы устанавливаете несколько подключений к Ble, что запрещено и получило BleAlreadyConnectedException.
как указал Дин Сюй, вы должны многоадресно передавать свой Observable, чтобы предотвратить это. (вы можете использовать различные операторы публикации/распространения)

person yosriz    schedule 19.06.2017
comment
Возможно, мне придется изменить свой вопрос ... потому что я читал разные UUID, есть две разные темы. дело не в этом: одна и та же тема и несколько наблюдателей - person 楊舜淼; 19.06.2017
comment
не уверен, что понимаю ваш смысл, но проблема в том, что несколько device.establishConnection, вы можете прочитать 2 разных UUID, это просто само соединение, которое нельзя создать дважды, поэтому вам нужно многоадресное соединение, а затем создать 2 отдельные темы из одного и того же связь. - person yosriz; 19.06.2017
comment
я просто вызываю device.installConnection() один раз, поэтому я не знаю, почему я получаю это исключение... - person 楊舜淼; 19.06.2017
comment
кажется, вы применяете решение при редактировании ответа, во всяком случае, device.establishConnection() просто создает Observable, не выполняя фактическое соединение, когда вы подписываетесь, логика подписки Observable выполняется, и когда вы подписываетесь дважды, она выполнялась дважды - person yosriz; 19.06.2017
comment
Спасибо за ваше объяснение, я также делаю некоторые тесты, ob = installConnection(false).publish() и затем ob.connect(), затем дважды вызываю ob.flatMap().subscribe() ...., все в порядке, ни одной ошибки... - person 楊舜淼; 19.06.2017