检查Android上是否有待处理的BLE操作

时间:2016-10-19 13:30:33

标签: android bluetooth bluetooth-lowenergy

Android的BLE API(据我所知,所有BLE API)都是异步的而不是排队的。也就是说,如果你这样做(伪代码):

characteristic.write("a");
characteristic.write("b");

第二次写入将立即取代第一次写入,永远不会发送。在实践中你必须做这样的事情:

characteristic.write("a");

void onCharacteristicWrite() {
     characteristic.write("b");
}

我的问题是:在Android上是否有办法检查BluetoothGatt是否有待处理的读取或写入操作,因此我可以知道是否会覆盖现有操作?或者我是否需要自己手动跟踪?

1 个答案:

答案 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();
}