2017-02-20 28 views
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) 

我懷疑這幾件事情或許正在於:

  1. 主UI線程穩步前進,並試圖顯示發現的設備的空載體。如果是這樣的話,我怎麼能讓它等待設備掃描完成而不會讓系統陷入困境?我認爲RxJava平臺消除了AsyncTask選項。
  2. 測試掃描完成的while()循環可能會消耗太多的CPU週期,從而阻止掃描成功。我怎樣才能解決這個問題?
+1

將代碼保存在asynctask完成後要執行的函數中。並在後期執行asynctask時調用它。 –

+1

while循環在哪裏?你爲什麼試圖等待積極? Observable將以異步方式運行,並在事件結束時觸發事件 – yosriz

回答

0

解決該問題的方法是通過使用scanSubscriber的onCompleted()回調來繼續執行程序的流程。