如何让Android活动等待异步进程的完成

时间:2017-02-20 06:38:09

标签: android multithreading rx-java rx-android rxandroidble

使用RxAndroidBle进行蓝牙LE连接。它用于扫描和识别具有给定服务UUID的设备(并将它们添加到Vector)。但是当我在while循环中添加一个自旋锁(实际上是一个AtomicBoolean)以检测扫描何时完成时,它似乎不再找到设备。

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 个答案:

答案 0 :(得分:0)

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