2017-08-10 125 views
0

我正在使用RxAndroidBLE庫來發現我的GATT服務器中的服務。 它大部分時間都能正常工作,但通常我得到GATT錯誤133(0x85),並且失敗。我想重試發現一段時間的服務時間,比如說5秒。 這裏是我想如何在GATT錯誤的情況下重試RxAndroidBLE發現服務。

bleDevice = mBleClient.getBleDevice(macAddress); 
    subscription = bleDevice.establishConnection(false) 
      .flatMap(RxBleConnection::discoverServices) 
      .first() // Disconnect automatically after discovery 
      .observeOn(AndroidSchedulers.mainThread()) 
      .doOnUnsubscribe(this::onUnsubscribe) 
      .compose(this.bindToLifecycle()) 
      .retryWhen(errors -> errors.flatMap(error -> { 
         if (isGattError(error) { 
          return Observable.just(new Object()); 
         } else { 
          return Observable.error(error); 
         } 
        } 
      )) 
      .timeout(5, TimeUnit.SECONDS) 
      .subscribe(this::getScanResult, this::onConnectionFailure); 

它不工作,看起來像retryWhen是沒有得到所謂的代碼。這可能是更多的rxJava問題,但我真的很感激任何幫助。

+0

你好@Avijeet - 你確定連接和服務發現將在5秒內成功完成嗎? –

+0

我觀察到的是,當它工作時,服務發現只需要一兩秒鐘。 5秒的時間間隔可以更改,主要問題是如何重試。 – Avijeet

+0

你在'.onUnsubscribe()'中做了什麼? –

回答

1

正如您在評論中所寫,您的this::onUnsubscribe正在調用subscription.unsubscribe(),因此.retryWhen()運算符不可能被調用。

您可以移動.retryWhen()下面的.doOnUnsubscribe()或其他方式來獲得預期的行爲。

+0

謝謝Dariusz,我有你的另一個小問題,我們可以嘗試retryWhen方法connectionObservable以及?我在準備Connection Observable時也面臨同樣的問題(錯誤133)。 – Avijeet

+0

是的,'RxBleDevice.establishConnection()'已經可以使用'.retryWhen()'。 '.retryWhen()'唯一的問題是當它用在從'RxBleConnection'獲得的'Observable's並且連接本身將被斷開連接時 - 那些重試時的可觀察對象將返回斷開異常。需要建立一個新的連接。 –

+0

您是否有我們可以處理異常並重試連接的示例。我一直在觀察,有些時候垃圾收集會導致BLE gatt斷開連接,然後我的代碼一直在等待連接並從我的設備中讀取。 – Avijeet

相關問題