微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

遇到 BleAlreadyConnectedException 时重新开始读取 onErrorResumeNext 中的数据

如何解决遇到 BleAlreadyConnectedException 时重新开始读取 onErrorResumeNext 中的数据

我正在使用 RXAndroidBle 库从 BLE 设备连接和读取数据。我已将 establishConnection 函数设置为 true,即自动连接为 true。当 BleAlreadyConnectedException 发生时,我想捕获该异常并重新启动读取数据流,因为每次处理和连接到 BLE 设备时都会产生问题。所以最好保持连接并重新读取数据。

onErrorResumeNext 中,我重新调用函数 writeStatus、readModelInfo、getReadings 等。现在确定我将如何实现它。

   device.establishConnection(true)
        .flatMap(rxBleConnection -> {
            rxBleConnection.discoverServices();
            mRxBleConnection = rxBleConnection;
            return Observable.just(rxBleConnection);
        })
        .flatMap(rxBleConnection -> rxBleConnection.setupNotification(TSDictionary.BATTERY_LEVEL,NotificationSetupMode.QUICK_SETUP).flatMap(it->it))
        .flatMap(bytes -> writeStatus())
        .flatMap(bytes->readModelInfo(bytes))
        .flatMap(bytes -> getReadings(bytes))
        .doOnNext(data->initializeErrorHistory(data))
        .flatMap(data->getSequenceSize())
        .flatMap(length ->getoperationInfo(length))
        .doOnNext(data->initializeOperationInfo(data))
        .onErrorResumeNext(new Function<Throwable,ObservableSource<? extends ArrayList<Map<Integer,TSDictionaryMetaData>>>>() {
            @Override
            public ObservableSource<? extends ArrayList<Map<Integer,TSDictionaryMetaData>>> apply(@io.reactivex.annotations.NonNull Throwable throwable) throws Exception {

                if(throwable instanceof  BleAlreadyConnectedException){

                    // i want to RECALL/restart the  function call 
                    // writeStatus,readModelInfo,getReadings,initializeErrorHistory
                    // getSequenceSize,getoperationInfo,initializeOperationInfo
                }
                return null;
            }
        })
        .subscribe(data -> {

        },e -> {
            e.printstacktrace();
        });

解决方法

onErrorResumeNext 靠近连接代码。

device.establishConnection(true)
.doOnNext(rxBleConnection -> {
    rxBleConnection.discoverServices();
    mRxBleConnection = rxBleConnection;
})
.onErrorResumeNext(throwable -> {
     if (throwable instanceof BleAlreadyConnectedException) {
        return Observable.just(mRxBleConnection);
     }
     return Observable.error(throwable);
})
.flatMap(rxBleConnection -> 
     rxBleConnection.setupNotification(TSDictionary.BATTERY_LEVEL,NotificationSetupMode.QUICK_SETUP)
    .flatMap(it->it)
)
.flatMap(bytes -> writeStatus())
.flatMap(bytes->readModelInfo(bytes))
.flatMap(bytes -> getReadings(bytes))
.doOnNext(data->initializeErrorHistory(data))
.flatMap(data->getSequenceSize())
.flatMap(length ->getOperationInfo(length))
.doOnNext(data->initializeOperationInfo(data))
.subscribe(data -> {

},e -> {
    e.printStackTrace();
});

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。