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()
метод. В этот момент вы можете начать передачу файлов.