Как я могу использовать семафор для правильной связи Android?
У меня есть одно сомнение в связи с моим приложением для Android и одно периферийное устройство. Это периферийное устройство отправляет данные посредством уведомлений об определенных характеристиках "А", и я могу записывать на них другие определенные характеристики "Б". Для этого я делаю так:
Semaphore sem = new Semaphore(1);
void notifyActivation()
{bluetoothGatt.setCharacteristicNotification(characteristic, true);
BluetoothGattDescriptor descriptor = characteristic.getDescriptor(
UUID.fromString("00002902-0000-1000-8000-00805f9b34fb"));
if(descriptor != null )
{
try
{
sem.acquire();
}
catch (InterruptedException e)
{
e.printStackTrace();
}
Log.i("debug","scrittura descrittore");
descriptor.setValue(BluetoothGattDescriptor.ENABLE_NOTIFICATION_VALUE);
bluetoothGatt.writeDescriptor(descriptor);
}
}
@Override
public void onDescriptorWrite(BluetoothGatt gatt, BluetoothGattDescriptor descriptor, int status)
{
super.onDescriptorWrite(gatt, descriptor, status);
Log.i("debug", "descriptor status: "+status);
sem.release();
}
public void write(final BluetoothGattCharacteristic characteristic)
{
new Thread(new Runnable() {
@Override
public void run() {
try {
//acquisisco il semaforo se è libero se no mi blocco
sem.acquire();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
boolean res=bluetoothGatt.writeCharacteristic(characteristic);
if(!res)
{
Log.i("debug","scrittura fallita");
//res=bluetoothGatt.writeCharacteristic(characteristic);
}
sem.release();
}
}).start();
}
Я использовал семафор, потому что, если я делаю запись до того, как будет вызван ondescriptorwrite, запись завершится неудачно, но мне интересно, если таким образом я могу потерять некоторые уведомления...
Правильно ли используется семафор? Или это может создать какую-то проблему для меня?
1 ответ
Я думаю, что ваша модель семафора может работать. Но если вы делаете это так, вы должны установить тайм-аут, который очищает семафор на случай, если вы никогда не получите ответ. Это, безусловно, возможно, поскольку устройство могло выйти из зоны действия или отключиться (или даже разбиться).
Другой возможностью является использование шаблона проектирования команд и создание очереди команд для постановки в очередь команд, когда их несколько.