uni-app 断开蓝牙连接无法销毁onBLECharacteristicValueChange监听
uni-app 断开蓝牙连接无法销毁onBLECharacteristicValueChange监听
测试过的手机
华为鸿蒙
操作步骤
连接蓝牙,设置onBLECharacteristicValueChange 监听,发送数据,断开低功耗蓝牙,关闭蓝牙模块。 第二次 连接蓝牙,设置onBLECharacteristicValueChange 监听,发送数据
预期结果
第二次发送数据时候,onBLECharacteristicValueChange 收到硬件发送的一次数据
实际结果
第二次发送数据时候,onBLECharacteristicValueChange 收到硬件发送的两次数据,随着多次执行上述复现步骤,onBLECharacteristicValueChange 会收到多次数据
bug描述
在链接硬件设备的时候 每次链接都会使用 uni.onBLECharacteristicValueChange((resChange) => { let val = ab2hex(resChange.value); takeData(val); }) 来监听回调 连接蓝牙流程中,每次连接都会重新触发一次以上函数,断开蓝牙服务的api也没有销毁这类监听
更多关于uni-app 断开蓝牙连接无法销毁onBLECharacteristicValueChange监听的实战教程也可以访问 https://www.itying.com/category-93-b0.html
我一开始也是遇到这个问题,后来发现是uni.onBLECharacteristicValueChange在后面多次调用导致的。
可以把uni.onBLECharacteristicValueChange()放在onload()里面调用一次,然后uni.getBLEDeviceCharacteristics()被多次调用是没有关系的。
更多关于uni-app 断开蓝牙连接无法销毁onBLECharacteristicValueChange监听的实战教程也可以访问 https://www.itying.com/category-93-b0.html
有效的,大伙估计都是看文档 必须先启用 notifyBLECharacteristicValueChange 接口才能接收到设备推送的 notification 误以为是 必须先启用 notifyBLECharacteristicValueChange 接口再启用onBLECharacteristicValueChange
来个官方吧,救救孩子
已经放弃了…
在onLoad() 调用一次onBLECharacteristicValueChange是否可以解决多次回调的问题。
在 uni-app
中,使用蓝牙功能时,如果断开蓝牙连接后无法销毁 onBLECharacteristicValueChange
监听,可能是因为没有正确移除监听器。onBLECharacteristicValueChange
是一个监听蓝牙设备特征值变化的回调函数,如果不及时移除,可能会导致内存泄漏或其他问题。
以下是一些可能的解决方法:
1. 使用 offBLECharacteristicValueChange
移除监听器
在断开蓝牙连接时,确保调用 uni.offBLECharacteristicValueChange
来移除监听器。
// 监听蓝牙设备特征值变化
uni.onBLECharacteristicValueChange((res) => {
console.log('characteristic value changed:', res);
});
// 断开蓝牙连接时移除监听器
function disconnectBluetooth() {
uni.offBLECharacteristicValueChange(); // 移除监听器
uni.closeBLEConnection({
deviceId: 'your-device-id',
success(res) {
console.log('蓝牙连接已断开', res);
},
fail(err) {
console.error('断开蓝牙连接失败', err);
}
});
}
2. 确保在适当的时机移除监听器
确保在断开蓝牙连接或页面卸载时移除监听器。例如,在 onUnload
生命周期钩子中移除监听器。
export default {
onUnload() {
uni.offBLECharacteristicValueChange(); // 页面卸载时移除监听器
}
}
3. 检查设备 ID
确保在断开连接时传递正确的 deviceId
,以便正确移除监听器。
uni.closeBLEConnection({
deviceId: 'your-device-id', // 确保传递正确的设备 ID
success(res) {
console.log('蓝牙连接已断开', res);
},
fail(err) {
console.error('断开蓝牙连接失败', err);
}
});
4. 使用 Promise 或 async/await 确保顺序执行
如果断开连接和移除监听器的操作需要顺序执行,可以使用 Promise
或 async/await
来确保顺序。
async function disconnectBluetooth() {
await uni.offBLECharacteristicValueChange(); // 移除监听器
await uni.closeBLEConnection({
deviceId: 'your-device-id',
});
console.log('蓝牙连接已断开');
}
5. 检查 uni-app 版本
确保使用的 uni-app
版本是最新的,因为旧版本可能存在一些已知的 bug 或问题。
6. 调试和日志
在开发过程中,可以通过添加日志来调试监听器是否被正确移除。
uni.offBLECharacteristicValueChange(() => {
console.log('监听器已移除');
});