EasyBle
EasyBle copied to clipboard
多次订阅会出现多次回调
是否应该对已经订阅的特征值进行逻辑判断?
@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。
本来是有打算同一时刻连接多个的功能的,后来换项目没有设备调试,这个库就暂时搁置更新了。
谢谢大神的指导,这个库写的蛮好的,很实用,感觉很多都需要像您学习,特别是写代码的风格
大神应该努努力让这个框架支持同时连接多设备,不然就可惜了
已经收到你的邮件,我会尽快回复的