如何使 Android activity 等待异步过程完成
How to make Android activity wait for completion of async process
使用 RxAndroidBle 进行低功耗蓝牙连接。它用于扫描和识别具有给定服务 UUID 的设备(并将它们添加到矢量)。但是当我在 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)
我怀疑可能发生了几件事:
- 主 UI 线程已向前推进并尝试显示已发现设备的空矢量。如果是这样,我怎样才能让它等待设备扫描完成而不会使系统陷入困境?我认为 RxJava 平台消除了
AsyncTask
选项。
- 测试扫描完成的
while()
循环可能消耗了太多 CPU 循环,导致扫描无法成功。我怎样才能解决这个问题?
该问题的解决方案是避免它,方法是使用 scanSubscriber 的 onCompleted()
回调来继续程序的流程。
使用 RxAndroidBle 进行低功耗蓝牙连接。它用于扫描和识别具有给定服务 UUID 的设备(并将它们添加到矢量)。但是当我在 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)
我怀疑可能发生了几件事:
- 主 UI 线程已向前推进并尝试显示已发现设备的空矢量。如果是这样,我怎样才能让它等待设备扫描完成而不会使系统陷入困境?我认为 RxJava 平台消除了
AsyncTask
选项。 - 测试扫描完成的
while()
循环可能消耗了太多 CPU 循环,导致扫描无法成功。我怎样才能解决这个问题?
该问题的解决方案是避免它,方法是使用 scanSubscriber 的 onCompleted()
回调来继续程序的流程。