2017-02-09 90 views
0

我已经发起了一个BLE连接,在onServicesDiscovered我要读出所有的描述符。有五他们和我继续此:GATT onDescriptorRead - 只有一个回调

for (int n=0;n<descriptors.size();n++) 
{ 
    gatt.readDescriptor(descriptors.get(n)); 
} 

描述符包含所有描述符... 然后读回调被调用,我要读出描述符值:

@Override 
public void onDescriptorRead(BluetoothGatt gatt, final BluetoothGattDescriptor descriptor, int status) 
{ 
    deviceInfoArray.add(new ItemSlideMenu(new String(descriptor.getValue())); 
} 

问题是,读取回调只调用一次,而不是五次。你能告诉我为什么以及如何解决这个问题吗?

回答

0

这是一个好主意,谢谢!特别是当你有不同的GATT操作时。不过我这样解决:

@Override 
public void onDescriptorRead(BluetoothGatt gatt, final BluetoothGattDescriptor descriptor, int status) 
    { 
     deviceInfoArray.add(new ItemSlideMenu(new String(descriptor.getValue()), descriptor.getCharacteristic())); 
     //Call this to update the adapter of deviceInfoList 
     getActivity().runOnUiThread(updateAdapter); 
     Log.d("xxx", new String(descriptor.getValue())); 

     if(descriptors.size() > 1) 
     { 
      BluetoothGattDescriptor tempDescriptor = descriptors.get(1); 
      descriptors.remove(1); 
      mGatt.readDescriptor(tempDescriptor); 
     } 
    } 

onDescriptorRead被称为递归并终止自己。

1

您一次只能有一个杰出的gatt操作。您必须等到相应的回调被触发后才能进行新的读取。解决这个问题的好方法是拥有一个队列数据结构。当你想做一个读/写操作时,在这个队列中插入一个操作。每当你插入一个操作并且队列已经是空的,或者你得到一个回叫,告诉某个操作已经完成,那么发出队列中的下一个操作。 gatt回调到达时从队列中移除操作。这样你就可以确保一次只有一次操作是未完成的。

您还可以将Runnable附加到gatt回调到达时应该调用的操作。

+0

有没有办法检查gatt Operation是否正在运行?我想将它们排队在一起,但我不确定哪一个按时运行。 –

+0

API没有办法检查。你必须以线程安全的方式自己完成 – Emil

+0

嗯..我写下了所有的操作,现在手动检查它们。很棒! –