Я работаю со службой BLE GATT, которая имеет две характеристики, которые работают в тандеме. Одна характеристика предназначена только для записи, в которой вы можете отправить строковое значение в качестве запроса, а другая — характеристика только для уведомления, когда вы получаете ответ на запрос.
Служба уведомлений работает немного медленно, и важно не переходить к следующему запросу до того, как уведомление будет прочитано, иначе ответ будет потерян.
С этой целью я использовал RxAndroidBle Observables с отдельными каналами для характеристик записи и уведомления. Третий Observable предоставляет запросы. Однако записи шли слишком быстро.
ConnectableObservable notifyObservable =
createNotifyObservable(NOTIFY_UUID).publish();
queryObserverable
.doOnSubscribe(notifyObservable::connect)
.doOnNext(query -> Log.d(TAG, "Processing query: " + query))
.flatMap(query -> createWriteObservable(WRITE_UUID, query)))
.doOnNext(request -> Log.d(TAG, "Write initiated."))
.flatMap(request -> notifyObservable)
.doOnNext(response -> Log.d(TAG, "Query response: " + response));
Итак, при запуске приложения вот что я вижу в журналах (включая метку времени, идентификатор процесса и идентификатор потока):
06-22 14:30:01.991 14085-15360 Processing query: Query1
06-22 14:30:02.011 14085-15360 Processing query: Query2
06-22 14:30:02.011 14085-15360 Processing query: Query3
06-22 14:30:07.261 14085-15443 Write initiated.
06-22 14:30:07.301 14085-15445 Write initiated
06-22 14:30:07.321 14085-15447 Query response: Response3
06-22 14:30:07.321 14085-15449 Write initiated.
06-22 14:30:07.321 14085-15447 Query response: Response3
06-22 14:30:07.351 14085-15453 Query response: Response3
Есть ли способ с RxJava гарантировать, что следующая запись произойдет только после получения ответа?
EDIT: при указании предлагаемого аргумента maxConnection
для обоих вызовов flatMap
вызовы происходят в правильном порядке, но только для первого запроса из Observable. Вот лог для этого случая:
06-22 14:39:09.841 22245-23079 Processing query: Query1
06-22 14:39:15.131 22245-23166 Write initiated.
06-22 14:39:15.201 22245-23169 Query response: Response1