Что не так с сохранением RxBleConnection
в переменной и использованием ее для нескольких .subscribe()
? (...) Что значит сказать, что несколько подписок «вводят состояние» и как это может вызвать проблемы?
Эти два вопроса почти одинаковы. RxBleConnection
— это абстракция над состоянием, в котором клиент BLE обменивается некоторыми пакетами рукопожатия с сервером BLE, после чего и клиент, и сервер считаются подключенными. К сожалению, по разным причинам это соединение может быть разорвано почти в любой момент (и это случается довольно часто), что не может быть легко выражено одной хранимой переменной RxBleConnection
реактивным способом.
С другой стороны, наблюдение за RxBleDevice.establishConnection()
приведет к распространению ошибки подписчику после разрыва соединения. Хотя ни одна из функций, которые выдает RxBleConnection
, не будет работать после разрыва соединения - сохраненная переменная соединения не будет информировать о проблеме, когда она произойдет.
Поэтому, если пользователь сохраняет RxBleConnection
в переменную, это вводит состояние, в котором может находиться переменная, и пользователь несет ответственность за распространение (очистку переменной) ошибок, которые могут произойти позже. Наоборот, подписка на .establishConnection()
вызовет исключение, когда соединение не может быть использовано.
Как многие программисты могли заметить в ходе своей практики, управление состоянием является наиболее распространенным источником ошибок в приложениях. Уменьшение состояния — это способ снизить риск ошибок.
Есть отличное (но довольно продвинутое) выступление Джейка Уортона от Devoxx: Управление состоянием с помощью RxJava, Джейк Уортон
Если это проблема, как ConnectionSharingAdapter
решает ее?
Наблюдаемый .establishConnection()
не позволяет иметь более одной одновременной подписки из-за природы подключения и связи BLE с отслеживанием состояния (запрос-ответ — хорошо известный шаблон), а наличие более одного .subscribe()
, использующего одно и то же соединение, может вызвать помехи для другого. без явного следа в коде. Вот почему BleAlreadyConnectedException
был введен для пользователей, которые не следят за всеми местами в коде, где используется RxBleConnection
. ConnectionSharingAdapter
был представлен в качестве помощника для пользователей, которые сознательно решают разделить одно соединение между несколькими интеракторами. Если RxBleConnection
сломается, ConnectionSharingAdapter
распространит ошибку на все Subscriber
.
Есть ли какой-нибудь чистый способ объединения всех четырех характерных операций ввода-вывода в одну .subscribe()
(которая не ухудшит производительность)?
В большинстве ситуаций можно аккуратно объединить множество операций ввода-вывода. Вышеупомянутый доклад затрагивает эту тему. Правильное объединение нескольких вводов-выводов сопряжено со стоимостью дополнительных выделений, но это редко является проблемой при работе с BLE из-за низкой скорости этого канала связи.
person
Dariusz Seweryn
schedule
19.06.2017
publish()
RxJava), и обсуждение использования субъектов — это более широкий вопрос, на который, вероятно, уже есть ответы на этот вопрос. сайт и многие другие ресурсы. - person Whymarrh   schedule 19.06.2017RxAndroidBle
. У меня тот же вопрос о библиотеке, и я попал сюда из обсуждения библиотеки на github. @РобертЛьюис - person JohnnyLambada   schedule 03.01.2019