Использование RxAndroidBle для соединений Bluetooth LE. Он работает для сканирования и идентификации устройств с данным Service UUID (и добавления их в вектор). Но когда я добавляю спин-блокировку (на самом деле AtomicBoolean
) в цикле while, чтобы обнаружить, когда сканирование завершено, оно больше не находит устройства.Как заставить активность Android ждать завершения асинхронного процесса
public void scanForScopes() {
Log.d(LOG_TAG, "Entered scanForScopes()");
rxBleDeviceVector.clear();
asDeviceVector.clear();
// since we added time and device count limits, we know this Observable will not run forever
scanSubscriber = new AsScanSubscriber<>();
scanSubscription = asBleClient
.scanBleDevices(asServiceIdArray)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.take(MAX_SCOPES)
.take(SCAN_TIME, TimeUnit.SECONDS)
.doOnNext(this::addRxBleScanResult) // works
.doOnCompleted(() -> Log.d(LOG_TAG, "Scan for scope devices has completed")) // doesn't seem to be called
.subscribe(scanSubscriber); // calls scanSubscriber.onStart() (which sets nowScanning true)
Я подозреваю, что несколько вещей, которые могут идти на:
- Основной поток UI подделал вперед и попытался отобразить пустой вектор обнаруженных устройств. Если это так, как я могу дождаться завершения сканирования устройства без увязки системы? Я думаю, что платформа RxJava исключает опцию
AsyncTask
. - Цикл
while()
, который проверяет завершение сканирования, может потреблять слишком много циклов процессора, что препятствует успешному сканированию. Как я могу это исправить?
сохранить код в функции, которую вы хотите выполнить после завершения асинтезы. и назовите его после выполнения asynctask. –
где цикл while? почему вы пытаетесь активно ждать? Observable будет работать в асинхронном режиме и будет запускать события, когда он закончит – yosriz