2017-02-09 91 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

嗯..我寫下了所有的操作,現在手動檢查它們。很棒! –