用于读取某些特征的Android BLE API方法本质上是异步的,当您请求某些值时,将调用您的GATT回调方法。
如果您请求多个读取特征值,它只会丢弃其他值,直到它不接受第一个请求为止。
我不明白是否这样,为什么他们制作方法Async。如果有人知道我们应该采用哪种设计模式来解决这个问题,请分享。
如果你想阅读一些特征,那么你必须要求它。
// new value available will be notified in Callback Object
mBluetoothGatt.readCharacteristic(ch);
GATT回调
public void onCharacteristicRead(BluetoothGatt gatt, android.bluetooth.BluetoothGattCharacteristic characteristic, int status)
可能的解决方案#1
https://code.google.com/p/guava-libraries/wiki/ListenableFutureExplained
任何人都可以解释如何使用它。我认为这对这种情况有帮助,但我仍然在寻找如何使用它。
可能的解决方案#2
可能的解决方案#3
http://tutorials.jenkov.com/java-util-concurrent/synchronousqueue.html
可能的解决方案#4
可能的解决方案#5
https://stackoverflow.com/a/15816566/185022
更新
我已经成功使用了Queue preferredy SynchronousQueue但我会在测试后分享我的最终解决方案。指定超时,否则会卡住或者请求读取不支持读操作的特性。
您可以看到哪些特征具有可读性,可通知see this post
答案 0 :(得分:13)
伪代码:
1)使用FIFO队列或优先级队列取决于您的业务逻辑
2)插入您想要阅读的所有特征
3)调用您的requestCharacteristics方法,以便它可以开始使用您的队列
4)来自onCharacteristicsRead
来电,看看队列的大小是否大于零请求更多..请确保peek()
来自此处
5)现在你的requestCharacteristics方法执行poll()
并请求BLE GATT的特征。
答案 1 :(得分:1)
您可能已经自己发现了它,但它可能对其他人有用。
我不明白是否这样,为什么他们制作方法Async。
他们可能是这样做的,因为在同步执行中向另一台设备发送读取请求意味着在收到答案之前,您无法对您的应用程序执行任何操作。通过使它成为异步你可以做其他事情,但没有其他蓝牙请求。
答案 2 :(得分:0)
可能的解决方案#6:尝试https://github.com/BoltsFramework/Bolts-Android提供的任务功能: - )