如何使用信号量进行正确的android通信?

时间:2015-06-17 07:09:34

标签: android bluetooth-lowenergy semaphore java.util.concurrent android-ble

我对我的Android应用和一个外围设备的通信存在疑问。该外围设备通过某个特征“A”通知发送数据,我可以在另一个特征“B”上写入。 为此,我这样做:

   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 个答案:

答案 0 :(得分:1)

我认为你的信号量模式可以起作用。但是如果你这样做的话,你应该设置一个超时来清除信号量,以防你从未得到响应。这肯定是可能的,因为设备可能已经移出范围或断电(甚至崩溃)。

另一种可能性是使用命令设计模式并创建命令队列以在有多个命令时对命令进行排队。