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)
我怀疑这几件事情或许正在于:
- 主UI线程稳步前进,并试图显示发现的设备的空载体。如果是这样的话,我怎么能让它等待设备扫描完成而不会让系统陷入困境?我认为RxJava平台消除了
AsyncTask
选项。 - 测试扫描完成的
while()
循环可能会消耗太多的CPU周期,从而阻止扫描成功。我怎样才能解决这个问题?
将代码保存在asynctask完成后要执行的函数中。并在后期执行asynctask时调用它。 –
while循环在哪里?你为什么试图等待积极? Observable将以异步方式运行,并在事件结束时触发事件 – yosriz