Android的BLE API(据我所知,所有BLE API)都是异步的而不是排队的。也就是说,如果你这样做(伪代码):
characteristic.write("a");
characteristic.write("b");
第二次写入将立即取代第一次写入,永远不会发送。在实践中你必须做这样的事情:
characteristic.write("a");
void onCharacteristicWrite() {
characteristic.write("b");
}
我的问题是:在Android上是否有办法检查BluetoothGatt
是否有待处理的读取或写入操作,因此我可以知道是否会覆盖现有操作?或者我是否需要自己手动跟踪?
答案 0 :(得分:1)
我有另一种方式为你提出建议。
负责发送蓝牙请求的类声明:
private PriorityBlockingQueue<QueueRequest> queueRequestList;
然后声明一个发送请求的方法:
public void send(byte[] bytes, BTDelegate delegate) {
QueueRequest queueRequest = new QueueRequest(bytes);
if (queueRequestList.size() > 0) {
putOnQueueEnd(queueRequest);
return;
}
putOnQueueEnd(queueRequest);
sendRequest(queueRequest);
}
如您所见,此类检查是否有任何待处理请求。如果有,请放入队列并等待最后一个请求完成。如果队列中没有任何元素,请将其放入队列(以了解将来的请求,是否有待处理的请求)并立即发送。
当响应来自BLE设备时调用一个函数:
public void sendNextRequestAgain() {
popFirst();
QueueRequest request = peekFirst();
sendRequest(request);
}
表示:从队列中获取下一个元素。
优点:
QueueRequest
内保留您想要的任何数据(数据,代表,时间等)。其他一些方法:
private void putOnQueueEnd(QueueRequest queueRequest) {
queueRequestList.put(queueRequest);
}
private QueueRequest popFirst() {
return queueRequestList.poll();
}
private QueueRequest peekFirst() {
return queueRequestList.peek();
}