Как написать последовательную характеристику быстро и стабильно для BLE в Android?

Я разрабатываю BLE в Android, я могу сканировать, подключать и писать характеристики для устройства BLE.

Я вызываю следующую функцию для передачи BluetoothGatt и characteristic AsyncTask при нажатии Button .

 write_btn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { new WriteCharacteristic(mBluetoothGatt , HueCharacteristic).execute(); } }); 

Код характеристики записи выглядит следующим образом:

 private class WriteCharacteristic extends AsyncTask<String, Void, String> { public BluetoothGatt mGatt; public BluetoothGattCharacteristic mCharacteristic; public WriteCharacteristic(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic){ mGatt = gatt; mCharacteristic = characteristic; } @Override protected String doInBackground(String... urls) { mGatt.writeCharacteristic(mCharacteristic); return null; } } 

Но я пытаюсь нажать кнопку последовательно, кажется, что Android не записывал каждую characteristic устройства BLE .

Если я нажимаю кнопку последовательно в течение 5 раз, это будет потерять 1 ~ 3 раза. Он только два раза записывает characteristic устройства BLE .

Вопрос:

Is there any better way to write characteristic consecutive and stable to BLE device for Android?

Solutions Collecting From Web of "Как написать последовательную характеристику быстро и стабильно для BLE в Android?"

Система записи / записи в стеке Bluetooth Android не подходит для очередей нескольких операций. Вам нужно дождаться завершения операций перед отправкой по другому. Кроме того, поскольку ваш код использует AsyncTask , вы получите параллельное выполнение задач на некоторых устройствах, поэтому даже запросы не сериализуются, когда вы нажимаете кнопку.

Чтобы получить стабильные результаты из фреймворка, вам нужно будет поставить очередь этих запросов самостоятельно и дождаться, когда BluetoothGattCallback onCharacteristicWrite() запускается перед отправкой следующей команды. Вашему коду необходимо синхронизировать весь доступ к объекту GATT, чтобы следующий writeCharacteristic() никогда не writeCharacteristic() до тех пор, пока обратный вызов завершения не завершится для предыдущего запроса.