2017-02-20 33 views
0

使用RxAndroidBle进行蓝牙LE连接。它可以扫描和识别具有给定服务UUID的设备(并将它们添加到Vector中)。但是当我在while循环中添加一个自旋锁(实际上是一个AtomicBoolean)来检测扫描何时完成时,它似乎再也找不到这些设备。如何使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()循环可能会消耗太多的CPU周期,从而阻止扫描成功。我怎样才能解决这个问题?
+1

将代码保存在asynctask完成后要执行的函数中。并在后期执行asynctask时调用它。 –

+1

while循环在哪里?你为什么试图等待积极? Observable将以异步方式运行,并在事件结束时触发事件 – yosriz

回答

0

解决该问题的方法是通过使用scanSubscriber的onCompleted()回调来继续执行程序的流程。