Samira Radwan Ответов: 0

Android - подождите, пока метод полностью не будет выполнен


Всем Привет,

Как новый разработчик android, я работаю над приложением, которое подключается к устройству Bluetooth (BLE).
Я использую классы Java Bluetooth в том числе BlutoothGatt для подключения/отключения к этому устройству.
Все работает нормально.
Проблема:
У меня есть двоичный файл, который я пытаюсь отправить на устройство Bluetooth как обновление микропрограммы поэтому я переключаюсь с образа устройства/файла на этот файл. перед переключением я делаю некоторую подготовку, включая отсоединение BLE и повторное подключение, что занимает некоторое время, а затем другой метод считывает файл и отправляет его на устройство Bluetooth. Проблема заключается в том, что второй метод запускается до того, как BLE снова подключается, что приводит к ошибке.
Подключение и отключение происходит в результате первого метода. Мне нужно, чтобы приложение подождало, пока первый метод будет полностью выполнен и все фоновые функции, включая подключение, вернутся.
Я пробовал использовать семафор, но он, похоже, не работает. Как правильно это сделать?

Любая помощь будет действительно оценена по достоинству?

Что я уже пробовал:

Мой первый метод, который проверяет программное обеспечение перед отправкой файла:
private void checkSoftware(){
        bleLoader.switchImg();

    }


Метод, используемый для подготовки устройства Bluetooth перед обновлением/загрузкой файла .bin:
public void switchImg(){
        byte[] data = new byte[4];
        byte[] value = new byte[] {(byte)0x04,(byte)0x00,(byte)0x10,(byte)0x10};

        System.arraycopy(value,0,mFileImgHdr.uid,0,value.length);
        Log.d(LOG_TAG,"value1: " + value[0] + " value2: " + value[1] +" value3: "+ value[2] + " value4: " + value[3]);

        System.arraycopy(value,0,data,0,value.length);

        mOadService = gatt.getService(UUID.fromString(SERVICE_OAD_UUID));
        mCharListOad = mOadService.getCharacteristics();
        for (BluetoothGattCharacteristic characteristic : mCharListOad){
            if(characteristic !=null){
                if(characteristic.getUuid().toString().equals(IMG_IDENTIFY_UUID)){
                    Log.d(LOG_TAG,"switch image - write characteristic");
                    characteristic.setValue(data);
                    mCharIdentify = characteristic;
                    characteristic.setWriteType(BluetoothGattCharacteristic.WRITE_TYPE_DEFAULT);
                    boolean sent = gatt.writeCharacteristic(characteristic); 
                    if(sent){
                        Log.d(LOG_TAG, "switch image - characteristic  written");
                    }else{
                        Log.d(LOG_TAG, "switch image - failed to write characteristic");
                    }
                }
            }
        }
    }

//As a result of the previous method BLE device takes a while then disconnect and make a connection again.
//I can't check if the BLE/device is connected right after as it's still connected for a while as i said

Я использовал семафор, но, похоже, не работает:
Semaphore sem ;
        sem = new Semaphore(1,true); //using 0 stops execution
        try {
            sem.acquire();
            checkSoftware();

//            try{
//                //update GUI here
//                //lbl_progressDescription.setText("working on it...");
//            } finally {
//                sem.release();
//            }
        }catch (final InterruptedException ex){
            ex.printStackTrace();
            Log.d(LOG_TAG,ex.toString());
        }

David Crow

Когда ваше устройство Bluetooth будет полностью подключено, вы должны получить BluetoothDevice.ACTION_ACL_CONNECTED уведомление в вашем широковещательном приемнике onReceive() метод. В этот момент вы можете начать передачу файлов.

0 Ответов