下面是用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.*
中使用runblocking
和globalscope.launch
,但我不完全确定它们是否正确。
谢谢,亚当
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() 两