Цель кода
Я пытаюсь сделать так, чтобы функция ожидала полного запуска 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 и никогда не заканчивается, вызывая зависание остальной части приложения.
Мне кажется, что есть простой способ понять, что я ' Я не вижу, но я думал об этом весь день и пока ничего не нашел.