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