Я ценю, что на это, возможно, уже ответили, но я не могу найти решение, которое работает для меня.
Tl; dr: Как создать функциональный блок?
У меня есть следующий код, связанный с BLE, написанный на Kotlin для Android API 28.
override fun onServicesDiscovered(gatt: BluetoothGatt?, status: Int) {
for (gattService: BluetoothGattService in gatt!!.services) {
for (gattChar: BluetoothGattCharacteristic in gattService.characteristics) {
if (gattChar.uuid.toString().contains(ADC_SAMPLESET_0) && !subscribed_0) {
subscribed_0 = true
gatt.setCharacteristicNotification(gattChar, true)
val descriptor = gattChar.getDescriptor(
UUID.fromString(BleNamesResolver.CLIENT_CHARACTERISTIC_CONFIG)
)
descriptor.value = BluetoothGattDescriptor.ENABLE_NOTIFICATION_VALUE
gatt.writeDescriptor(descriptor)
}
Если if-выражение выше повторяется несколько раз, чтобы облегчить подписку на несколько характеристик BLE.К сожалению, функция gatt.writeDescriptor()
работает асинхронно.Мне нужно подождать, пока он вернется, прежде чем вызывать gatt.writeDescriptor()
для получения следующей характеристики.Как мне этого добиться?
Я пытался использовать runBlocking
и GlobalScope.launch
в kotlinx.coroutines.experimental.*
, но я не совсем уверен, что они правильные.
Спасибо, Адам