使用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)
我怀疑可能会发生一些事情:
AsyncTask
选项。 while()
循环可能会消耗太多CPU周期,从而阻止扫描成功。我怎样才能解决这个问题? 答案 0 :(得分:0)
问题的解决方法是通过使用scanSubscriber的onCompleted()
回调继续程序的流程来避免它。