2017-02-20 21 views
0

Использование 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) 

Я подозреваю, что несколько вещей, которые могут идти на:

  1. Основной поток UI подделал вперед и попытался отобразить пустой вектор обнаруженных устройств. Если это так, как я могу дождаться завершения сканирования устройства без увязки системы? Я думаю, что платформа RxJava исключает опцию AsyncTask.
  2. Цикл while(), который проверяет завершение сканирования, может потреблять слишком много циклов процессора, что препятствует успешному сканированию. Как я могу это исправить?
+1

сохранить код в функции, которую вы хотите выполнить после завершения асинтезы. и назовите его после выполнения asynctask. –

+1

где цикл while? почему вы пытаетесь активно ждать? Observable будет работать в асинхронном режиме и будет запускать события, когда он закончит – yosriz

ответ

0

Решение проблемы состояло в том, чтобы избежать этого, используя обратный вызов scanSubscriber onCompleted(), чтобы продолжить поток программы.