Наблюдение за состоянием соединения с помощью RXAndroidBlE

Я пытаюсь прослушать, подключено ли мое приложение к устройству 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()

person Martin Erlic    schedule 08.03.2019    source источник


Ответы (1)


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

  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}") }
    )
person Dariusz Seweryn    schedule 10.03.2019