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

7 回复

我一开始也是遇到这个问题,后来发现是uni.onBLECharacteristicValueChange在后面多次调用导致的。 可以把uni.onBLECharacteristicValueChange()放在onload()里面调用一次,然后uni.getBLEDeviceCharacteristics()被多次调用是没有关系的。

更多关于uni-app 断开蓝牙连接无法销毁onBLECharacteristicValueChange监听的实战教程也可以访问 https://www.itying.com/category-93-b0.html


有效的,大伙估计都是看文档 必须先启用 notifyBLECharacteristicValueChange 接口才能接收到设备推送的 notification 误以为是 必须先启用 notifyBLECharacteristicValueChange 接口再启用onBLECharacteristicValueChange

来个官方吧,救救孩子

得了吧,这个问题2020年的时候就有人提出来了,也不见官方有解释

已经放弃了…

在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 确保顺序执行

如果断开连接和移除监听器的操作需要顺序执行,可以使用 Promiseasync/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('监听器已移除');
});
回到顶部