Наблюдение за состоянием соединения с RXAndroidBlE - PullRequest
0 голосов
/ 09 марта 2019

Я пытаюсь прослушать, подключено ли мое приложение к устройству Bluetooth.Я пытаюсь напечатать результат connectionState, но приложение даже не достигает первого println, поэтому я не могу проверить, что они могут быть.Я хочу перечислить возможные состояния соединения, а затем настроить пользовательский интерфейс в ответ.Как я могу это сделать?

val rxBleClient = RxBleClient.create(this.context!!)
val bleDevice = rxBleClient.getBleDevice("34:81:F4:3C:2D:7B")

val disposable = bleDevice.establishConnection(true) // <-- autoConnect flag
 .subscribe({
  rxBleConnection ->

  // All GATT operations are done through the rxBleConnection.
  bleDevice.observeConnectionStateChanges()
  .subscribe({
   connectionState ->
   println("Connection State: $connectionState")

   if (connectionState != null) {
    enableBluetooth.setBackgroundResource(R.drawable.bluetooth_on) // Change image
    deviceConnected.setText(R.string.connected_to_hooplight) // Changed text
   } else {
    enableBluetooth.setBackgroundResource(R.drawable.bluetooth_off) // Change image
    deviceConnected.setText(R.string.connect_to_hooplight) // Changed text
   }

  }, {
   throwable ->
   Log.d("Error: ", throwable.toString())
  })
 }, {
  throwable ->
  // Handle an error here.
  Log.d("Error: ", throwable.toString())
 })

// When done... dispose and forget about connection teardown :)
disposable.dispose()

1 Ответ

2 голосов
/ 10 марта 2019

В приведенном выше коде есть две вещи:

  1. disposable.dispose() следует вызывать, когда подписанный поток больше не нужен.Если метод dispose вызывается сразу после подписки, на самом деле ничего не произойдет.Вот почему даже первый println не отображается.
  2. bleDevice.establishConnection() и bleDevice.observeConnectionStateChanges() функционально не зависят друг от друга.Соединение не должно быть установлено, чтобы наблюдать изменения.Даже если вы начнете наблюдать за изменениями после того, как соединение установлено, оно получит информацию только тогда, когда соединение закрыто (потому что это первое изменение с тех пор)

лучшеОдним из способов будет разделение наблюдаемого соединения, изменения потока и фактического соединения.Пример кода:

val observingConnectionStateDisposable = bleDevice.observeConnectionStateChanges()
    .subscribe(
        { connectionState ->
            Log.d("Connection State: $connectionState")

            if (connectionState == RxBleConnectionState.CONNECTED) { // fixed the check
                enableBluetooth.setBackgroundResource(R.drawable.bluetooth_on) // Change image
                deviceConnected.setText(R.string.connected_to_hooplight) // Changed text
            } else {
                enableBluetooth.setBackgroundResource(R.drawable.bluetooth_off) // Change image
                deviceConnected.setText(R.string.connect_to_hooplight) // Changed text
            }
        },
        { throwable -> Log.d("Error: ", throwable.toString()) }
    )

val connectionDisposable = bleDevice.establishConnection(false)
    .subscribe(
        { Log.d("connection established") }, // do your thing with the connection
        { throwable -> Log.d("Error on connection: ${throwable}") }
    )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...