2017-08-10 122 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

相关问题