2016-10-19 58 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

相關問題