当前位置: 首页 > 知识库问答 >
问题:

Kotlin中的Make功能块

甘英光
2023-03-14

下面是用Kotlin为Android API28编写的与BLE相关的代码。

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()。我如何实现这一点?

我试过在kotlinx.coroutines.experimental.*中使用runblockingglobalscope.launch,但我不完全确定它们是否正确。

谢谢,亚当

共有1个答案

田琛
2023-03-14

onDescriptorWrite()方法可能会有帮助。您应该已经在重写它了。

请尝试以下操作:

private var canContinue = false;

override fun onServicesDiscovered(gatt: BluetoothGatt, status: Int) { //gatt shouldn't be null, so the null-safe ? isn't needed
    loopAsync(gatt);
}

override fun onDescriptorWrite(gatt: BluetoothGatt, descriptor: BluetoothGattDescriptor, status: Int) {
    canContinue = true; //allow the loop to continue once a descriptor is written
}

private fun loopAsync(gatt: BluetoothGatt) {
    async { //Run it async
        gatt.services.forEach { gattService -> //Kotlin has a handy Collections.forEach() extension function
            gattService.characteristics.forEach { gattChar -> //Same for this one
                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)
                    while(!canContinue); //wait until canContinue becomes true and then continue
                }
            }
        }
    }
}

这有点怪怪的。可能有一种方法可以通过递归来实现,但是嵌套的for循环使其变得很棘手。

 类似资料:
  • 我查看了分支的https://github.com/android/architectory-samples/tree/dev-dagger/app/src/main/java/com/example/android/android/dev-dagger/android/dev-dagger/android/dev-dagger/android/dev-dagger/app/src/main/ja

  • 问题是我应该把和放在哪里,因为我不能使用带有扩展函数的同伴对象?

  • 我正在Kotlin Multiplatform的帮助下开发一个虚拟天气应用程序。我正在使用Decompose和MVIKotlin来尝试和共享除本地ui、用于IOS的SwiftUI和用于桌面和Android的Compose之外的所有业务逻辑。 我正在尝试有一个预期的可合成(用于暗主题和加载图像) 这意味着它们都已实现并存在,但由于某种原因,崩溃发生在NoSuchMethodError上。我发现了一些

  • 问题内容: 我在kotlin上开发应用程序,但需要良好的Java支持。我发现的问题是kotlin的功能。 这是我以前做的 但这会从kotlin库编译为Function1,并且由于jar的大小,我没有在jar中直接包含kotlin库,这使Java开发人员更加困难,因为他们必须下载kotlin库才能使用此功能方法。 我尝试使用Java的Supplier或Function接口,但发现Kotlin开发人员

  • 问题内容: 是否可以从Java代码访问扩展功能? 我在Kotlin文件中定义了扩展功能。 (生成的)java类在哪里。现在,我想用普通的Java代码访问它: 但是,这不起作用。 IDE无法识别该方法,并且编译失败。 起作用的是与kotlin的静态函数一起使用: 通过使用我的IDE似乎已正确配置。 我从kotlin文档中搜索了整个Java互操作文件,并且在谷歌上搜索了很多,但是找不到。 我究竟做错了

  • 问题内容: 这段代码的结果为56。 知道里面发生了什么吗?我很困惑。 问题答案: X返回(值+3),而Y返回(值* 2) 给定值为4,这表示。 尽管函数不受范围限制(这意味着您可以安全地“嵌套”函数定义),但是此特定示例容易出错: 1)您不能在调用 之前先调用,因为函数只有执行一次才真正定义。 2)调用两次将导致PHP重新声明function ,从而导致致命错误: 致命错误:无法重新声明y() 两