2017-02-09 3 views
0

私はBLE接続を開始しました。onServicesDiscoveredすべての記述子を読み上げます。そこにそれらの5があり、私はこれを続行:GATT onDescriptorRead - コールバックは1つだけです

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

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

記述子は が続い読み込みコールバックが呼ばれ、私はディスクリプタ値を読み出すつもりです...すべての記述子が含まれています

問題は、読み取りコールバックが5回ではなく1回だけ呼び出されることです。なぜ、どのようにこれを修正するか教えていただけますか?

答えて

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

一度に表示できるガット操作は1つだけです。新しい読み込みができるまで、対応するコールバックが発生するまで待つ必要があります。これを解決する良い方法は、キューのデータ構造を持つことです。読み込み/書き込みを行う場合は、このキューに操作を挿入します。操作を挿入してキューがすでに空であった場合、または何らかの操作が完了したことを伝えるコールバックを取得した場合は、キュー内で次の操作を発行します。 gattコールバックが到着したら、キューから操作を削除します。そうすれば、一度に1つの操作だけが未処理になることが保証されます。

gattコールバックが到着したときに呼び出される操作にRunnableを割り当てることもできます。

+0

gatt操作が実行されているかどうかを確認する方法はありますか?それらをまとめてキューしたいのですが、どちらが時間通りに実行されているのかわかりません。 –

+0

これを確認する方法はありません。あなたはスレッドセーフな方法でそれを自分で行う必要があります – Emil

+0

うーん。私はすべての操作を書き留めて、今は手動でチェックしています。よく働く! –

関連する問題