Как ждать завершения BluetoothGattCallback - PullRequest
0 голосов
/ 08 апреля 2020

Цель кода

Я пытаюсь сделать так, чтобы функция ожидала полного запуска BluetoothGattCallback, прежде чем я начну возвращать результаты, но я ' Мы еще не нашли способ сделать это.

    // Function checks to see if we can connect to the BluetoothGattServer
    fun checkIfConnects (context: Context, device: BluetoothDevice) {
        // Declare the callback at the start
        val bluetoothGattCallback = object : BluetoothGattCallback() {
            override fun onConnectionStateChange(
                gatt: BluetoothGatt,
                status: Int,
                newState: Int
            ) {
                when (newState) {
                    BluetoothProfile.STATE_CONNECTED -> {
                        // If we can connect, set connects to true
                        connects = true
                        gatt.disconnect()
                        gatt.close()
                    }
                    BluetoothProfile.STATE_DISCONNECTED -> {
                        gatt.close()
                    }
                }
            }
        }
        // Declare connects as false
        var connects = false
        // Start to connect to gatt
        device.connectGatt(context, false, bluetoothGattCallback)
        /*
           We want to be able to wait until the callback is fully done before
           we return the variable, or else it will always return false
        */
        return connects
    }

То, что я пробовал до сих пор

Первый обходной путь, который я сделал, это добавление функции задержки сразу после device.connectGatt (). Этот метод работает, но он также замедляет работу остальной части приложения и делает вещи действительно неуклюжими, поэтому я стараюсь избегать этой опции.

Следующее исправление, которое я попробовал, - поместить device.connectGatt. в runBlock, вот так

runBlocking { device.connectGatt(context, false, bluetoothGattCallback) }

Это исправление не работает, потому что то, что возвращает device.connectGatt, является объектом BluetoothGatt, поэтому сразу проходит через runBlock

Другое исправление попытался, установив переменную с именем Finished в ложь в начале функции, а затем, установив ее в true, всякий раз, когда я отсоединяюсь от ГАТТ. Затем я помещаю некоторое время l oop сразу после device.connectGatt (), которое повторяется до тех пор, пока не будет завершено. Это исправления работали время от времени, но часто время от времени зависает l oop и никогда не заканчивается, вызывая зависание остальной части приложения.

Мне кажется, что есть простой способ понять, что я ' Я не вижу, но я думал об этом весь день и пока ничего не нашел.

...