nziyouren/EasyBle

多次订阅会出现多次回调

BlackMonkeyidea opened this issue · 8 comments

是否应该对已经订阅的特征值进行逻辑判断?

@BlackMonkeyidea 能否说下具体场景呢?

在订阅功率特征值时,我自己手动调用了MyApplication.mBleCenterManager.getConnectedDeviceAdapter().enableNotification();
还有,一个原因导致我这么做,蓝牙可能因为某种原因断开了,然后重连后,之前的订阅无效了,所以手动调用了

@BlackMonkeyidea enableNotification和enableIndicator方法 最好不用手动调用,这个是由adapter内部根据蓝牙连接或者断开状态自动调用的,如果手动调用就乱了。蓝牙连接上后会自动订阅特征值,如果断开会取消订阅。如果中间因为某种原因蓝牙断开了,用户调用connectThenStart()重新连接上后,adapter会自动重新订阅特征值。
如果出现重连,之前订阅无效,有可能出现其他问题了。如果你觉得可以的话可以贴下关键调用的代码块。
PS:目前版本不支持同时连接多个设备,可以在多个连接设备之间切换。

谢谢您的建议,你说的确实没错,使用这个框架我也慢慢发现了你说的这些。
对于你提到的不支持同时连接多个设备,意思是不可以同一时刻连接多个吧?
目前我已经连接了3种Ble设备,按照你的说的建议,功能都正常。

连接监听代码如下:

    /**
     * 注册蓝牙监听
     *
     * @param register
     */
    public void registerBleObservers(final boolean register) {
        if (MyApplication.bleDeviceHashMap == null || MyApplication.bleDeviceHashMap.isEmpty()) {
            return;
        }

        //注册连接监听
        if (register) {
            MyApplication.mBleCenterManager.setBleDeviceListener(new BleDeviceListener() {
                @Override
                public void onDeviceStateChange(BleDevice bleDevice, BleDeviceState bleDeviceState) {
                    if (bleDeviceState == BleDeviceState.BLE_DEVICE_STATE_CONNECTED) {
                        if (MyApplication.bleDeviceHashMap.containsValue(bleDevice)) {
                            //重新订阅
//                            subscriptionNotification(true);
                            ToastUtils.showShortToast(bleDevice.getDeviceName() + "蓝牙已连接");
                        }
                    } else if (bleDeviceState == BleDeviceState.BLE_DEVICE_STATE_DISCONNECTED) {
                        if (MyApplication.bleDeviceHashMap.containsValue(bleDevice)) {
                            //停止订阅
//                            subscriptionNotification(false);
                            ToastUtils.showShortToast(bleDevice.getDeviceName() + "蓝牙已断开");
                            //开始搜索
                            MyApplication.mBleCenterManager.startScan();
                        }
                    }
                }

                @Override
                public void onDataComing(BleDevice bleDevice, BleDataType bleDataType, Object data) {

                }

                @Override
                public void onInteractComplete(BleDevice bleDevice, Object result) {

                }

                @Override
                public void onInteractUpdate(BleDevice bleDevice, BleStep bleStep) {
                    if (isFirst) {//视频加载完才开始计算
                        if (bleDevice.getDeviceName().matches("[\\s\\S]*")) {
                            handleBleData(YueyeBleGattAttributes.RIDING_TABLE_DEVICE, bleStep.rawData);
                        }
//                    if (bleDevice.getDeviceName().contains(YueyeBleGattAttributes.RIDING_TABLE_DEVICE)) {
//                        handleBleData(YueyeBleGattAttributes.RIDING_TABLE_DEVICE, bleStep.rawData);
//                    }
                        if (bleDevice.getDeviceName().contains(YueyeBleGattAttributes.HEART_RATE_DEVICE)) {
                            handleBleData(YueyeBleGattAttributes.HEART_RATE_DEVICE, bleStep.rawData);
                        }
                    }
                }

                @Override
                public void onInteractError(BleDevice bleDevice, Throwable throwable, BleStep bleStep) {

                }

                @Override
                public void onScanStart() {

                }

                @Override
                public void onScanStop() {

                }

                @Override
                public void onScanUpdate(BleScanResult bleScanResult) {
                    //断开后重新连接
                    if (MyApplication.bleDeviceHashMap.containsValue(bleScanResult.getBleDevice())) {
                        try {
                            MyApplication.mBleCenterManager.connectThenStart(bleScanResult.getBleDevice());
                        } catch (EasyBleException e) {
                            e.printStackTrace();
                        }
                    }
                }

                @Override
                public void onScanError(Throwable throwable) {

                }
            });
        }
    }

@BlackMonkeyidea 功能正常就好。你的理解是对的,就是不支持同一时刻连接多个。如果想连接其他设备的话,需要断开现有设备连接。
看你代码
MyApplication.mBleCenterManager.setBleDeviceListener
貌似你用的是老版本,新版本接口为addBleDeviceListener。

本来是有打算同一时刻连接多个的功能的,后来换项目没有设备调试,这个库就暂时搁置更新了。

谢谢大神的指导,这个库写的蛮好的,很实用,感觉很多都需要像您学习,特别是写代码的风格

大神应该努努力让这个框架支持同时连接多设备,不然就可惜了