2016-10-19 57 views
0

Android的BLE API(并且据我所知,所有BLE API)都是异步的并且不是排队的。也就是说,如果你做的(伪):检查Android上是否有挂起的BLE操作

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

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

characteristic.write("a"); 

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

我的问题是:有没有在Android上的方式来检查BluetoothGatt已经挂起的读或写操作,这样我就可以知道我是否会被改写的现有的操作?或者我需要手动跟踪自己?

回答

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(); 
} 
+0

是的这是类似于[北欧所做的](https ://github.com/NordicSemiconductor/puck-central-android/blob/master/PuckCentral/app/src/main/java/no/nordicsemi/puckcentral/bluetooth/gatt/GattManager.java#L53)。这可能是最好的方法;我只是想知道是否有其他选择。 – Timmmm

相关问题