Android como ler várias características do BLE com um PriorityQueue

Um pouco preso aqui, pode precisar de sua ajuda. Quero ler várias características do BLE ao mesmo tempo, algumas pessoas sugerem o uso do PriorityQueue para isso. Eu já conheço todos os uuids, etc., só preciso ler vários de uma vez. Alguém poderia explicar como exatamente deveria ser? Ou talvez haja mais uma solução mais fácil?

Agradecemos antecipadamente, aqui está o meu código:

public static final BluetoothGattCallback mGattCallback = new BluetoothGattCallback() {

    PriorityQueue<BluetoothGattCharacteristic> queue = new PriorityQueue<BluetoothGattCharacteristic>();

    // When connection state changes
    @Override
    public void onConnectionStateChange(BluetoothGatt gatt, int status, int newState) {
        if (newState == BluetoothProfile.STATE_CONNECTED) {
            Log.v(TAG, "Connected!");
            gatt.discoverServices();
        }
        if (newState == BluetoothProfile.STATE_DISCONNECTED) {
            Log.v(TAG, "Disconnected...");

        }
    }

    @Override
    public void onServicesDiscovered(BluetoothGatt gatt, int status) {

        List<BluetoothGattService> services = gatt.getServices();
        BluetoothGattService rightService = null;

        for (int i = 0; i < services.size(); i++) {
            if (services.get(i).getCharacteristics().size() > 8) {
                rightService = services.get(i);
            }
        }

        List<UUID> uuidsList;

        UUID TRANSMISSION_POWER = rightService.getCharacteristics().get(4).getUuid();
        UUID BROADCASTING_INTERVAL = rightService.getCharacteristics().get(6).getUuid();
        UUID BEACON_NAME = rightService.getCharacteristics().get(8).getUuid();
        UUID CONNECTION_MODE = rightService.getCharacteristics().get(9).getUuid();
        //UUID SOFT_REBOOT = rightService.getCharacteristics().get(10).getUuid();

        uuidsList = new ArrayList<UUID>();

        uuidsList.add(TRANSMISSION_POWER);
        uuidsList.add(BROADCASTING_INTERVAL);
        uuidsList.add(BEACON_NAME);
        uuidsList.add(CONNECTION_MODE);
        //uuidsList.add(SOFT_REBOOT);

        queue.add(rightService.getCharacteristic(uuidsList.get(0)));
        queue.add(rightService.getCharacteristic(uuidsList.get(1)));
        queue.add(rightService.getCharacteristic(uuidsList.get(2)));

    }

    @Override
    public void onCharacteristicRead(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic, int status) {

        Log.v(TAG, "CHARACTERISTIC VALUE___: " + characteristic.getIntValue(BluetoothGattCharacteristic.FORMAT_UINT8, 0));
        onServicesDiscovered(gatt, 0);

    }

};

ATUALIZAR:

mesmo depois de colocá-los em threads diferentes, ele ainda reage apenas a um gatt.readCharacteristic (...). como a seguir:

// Gatt Callback
public static final BluetoothGattCallback mGattCallback = new BluetoothGattCallback() {

    // When connection state changes
    @Override
    public void onConnectionStateChange(BluetoothGatt gatt, int status, int newState) {
        if (newState == BluetoothProfile.STATE_CONNECTED) {
            Log.v(TAG, "Connected!");
            gatt.discoverServices();
        }
        if (newState == BluetoothProfile.STATE_DISCONNECTED) {
            Log.v(TAG, "Disconnected...");

        }
    }

    @Override
    public void onServicesDiscovered(BluetoothGatt gatt, int status) {


        List<BluetoothGattService> services = gatt.getServices();

        /*
        DISPLAY ALL SERVICES AND CHARACTERISTICS

        for (int i = 0; i < services.size(); i++) {
            Log.v(TAG, "SERVICE____: " + services.get(i).getUuid());

            for (int k = 0; k < services.get(i).getCharacteristics().size(); k++) {
                Log.v(TAG, "CHARACTERISTIC____: " + services.get(i).getCharacteristics().get(k).getUuid());
            }

        }
        */

        BluetoothGattService rightService = null;

        for (int i = 0; i < services.size(); i++) {
            if (services.get(i).getCharacteristics().size() > 8) {
                rightService = services.get(i);
            }
        }

        List<UUID> uuidsList;

        UUID TRANSMISSION_POWER = rightService.getCharacteristics().get(4).getUuid();
        UUID BROADCASTING_INTERVAL = rightService.getCharacteristics().get(6).getUuid();
        UUID BEACON_NAME = rightService.getCharacteristics().get(8).getUuid();
        UUID CONNECTION_MODE = rightService.getCharacteristics().get(9).getUuid();
        //UUID SOFT_REBOOT = rightService.getCharacteristics().get(10).getUuid();

        uuidsList = new ArrayList<UUID>();

        uuidsList.add(TRANSMISSION_POWER);
        uuidsList.add(BROADCASTING_INTERVAL);
        uuidsList.add(BEACON_NAME);
        uuidsList.add(CONNECTION_MODE);
        //uuidsList.add(SOFT_REBOOT);


        class powerThread extends Thread{

            UUID uuid;
            BluetoothGatt gatt;
            BluetoothGattService service;
            public powerThread(UUID uuid, BluetoothGatt gatt, BluetoothGattService service) {
                this.gatt = gatt;
                this.service = service;
                this.uuid = uuid;
            }
            @Override
            public void run() {
                gatt.readCharacteristic(service.getCharacteristic(uuid));
            }
        }
        powerThread pt = new powerThread(TRANSMISSION_POWER, gatt, rightService);
        pt.run();


        class intervalThread extends Thread{

            UUID uuid;
            BluetoothGatt gatt;
            BluetoothGattService service;
            public intervalThread(UUID uuid, BluetoothGatt gatt, BluetoothGattService service) {
                this.gatt = gatt;
                this.service = service;
                this.uuid = uuid;
            }
            @Override
            public void run() {
                gatt.readCharacteristic(service.getCharacteristic(uuid));
            }
        }
        intervalThread it = new intervalThread(BROADCASTING_INTERVAL, gatt, rightService);
        it.run();


    }

    @Override
    public void onCharacteristicRead(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic, int status) {

        Log.v(TAG, "CHARACTERISTIC VALUE___: " + characteristic.getIntValue(BluetoothGattCharacteristic.FORMAT_UINT8, 0));

    }

};

questionAnswers(2)

yourAnswerToTheQuestion