uni-app有没有移除监听蓝牙特征值变化事件的api?

发布于 1周前 作者 h691938207 来自 uni-app

uni-app有没有移除监听蓝牙特征值变化事件的api?
业务中需要用到监听 uni.onBLECharacteristicValueChange() 接口监听特征值变化,然后用户也可以随时取消监听,Dcloud能否提供一下取消监听蓝牙特征值变化的API啊。

17 回复

人力都去搞uts去了,不然怎么赶日超美


官方就没一个响应吗?这方面微信小程序API就比较全面,你Uniapp也就是拿着h5+plus的API改造改造,那也得加一些自己的东西进去啊,完全是基于h5+plus的API二次封装而已,那我还用你干嘛?

这个问题困扰也是有大半年了,问了好多问题也没人回复。微信小程序中是有移除对应监听事件的,感觉马上要弃坑了。还不如专做一个小程序了。你现在的问题解决了吗?

关闭蓝牙模块也无法关闭监听,蓝牙断开重连后监听到的数据也有异常。

我们也遇到这个问题了啊,郁闷啊。 第一次手机连接设备的时候,一切正常。 但是如果断开连接,重新连接设备的话,那么之前的监听还在,就会同时存在多个监听,然后会造成各种问题,怎么都关不掉之前的监听啊。

解决掉了, 就是在监听的位置做一个判断,如果接收到的数据跟上一条或前几条数据一样,那就直接return,不处理,就没事了

回复 yushen999: 用你的这个方法是解决多次监听数据相同,但本质时没有解决多次监听事件

2年了,都还没修复掉,无语

加一个取消监听而已,两年多了还没解决吗? 用论坛找到的$emit、$on也不行,只有第一次进界面的时候修改数据能刷新视图,后面怎么玩都不行了,而且$off无效,到另一个界面再$on开启,执行的还是前一个界面的,不管加不加参数,$off多少次,都一样,这些bug这么多年都没人修复的吗?uniapp现在到底有没有人维护????? 多个界面需要监听蓝牙数据,数据量也大,还要刷新界面视图,请问有解决方案吗?

说真的,这都三年了,这个东西都还提供不了吗,一个官方论坛也没什么官方技术人员来解答问题,真的很垃圾

都特喵三年了还没解决,微信小程序不就有对应的API吗?uni官方抄都不会抄?

都特喵四年了,还没解决吗

uniapp就是个坑,这问题无解的,我现在的解决方案就是,在APP.vue中初始化一次,初始化后特征值变化就把数据都存在vuex/pinia中,然后页面监听vuex/pinia的数据变化,实时刷新

都特喵四年了,还没解决吗???

都TM第五年了。。。

五年,你知道这五年我怎么过的吗

在uni-app中,对于蓝牙功能的操作主要是通过调用uni.openBluetoothAdapteruni.getBluetoothDevicesuni.createBLEConnectionuni.onBLECharacteristicValueChange等一系列API来实现的。关于你的问题,uni-app本身并没有直接提供一个专门的API来移除监听蓝牙特征值变化事件,但你可以通过停止监听事件来达到类似的效果。

在JavaScript中,事件监听器通常是通过addEventListener(或类似的方法)来添加的,而移除监听器则通过removeEventListener来实现。对于uni-app中的蓝牙事件,虽然使用的是uni.onBLECharacteristicValueChange来监听特征值变化,但停止监听并不是通过直接的反向API来完成的,而是通过管理事件监听器的引用并在需要时手动移除。

以下是一个简单的代码示例,展示了如何添加和移除蓝牙特征值变化事件的监听器:

// 假设你已经连接到了一个蓝牙设备,并且获取了服务的特征值
let characteristicId = 'your-characteristic-id'; // 特征值ID
let serviceId = 'your-service-id'; // 服务ID
let deviceId = 'your-device-id'; // 设备ID

// 监听蓝牙特征值变化事件
function startListening(callback) {
    uni.onBLECharacteristicValueChange(function (res) {
        if (res.deviceId === deviceId && res.serviceId === serviceId && res.characteristicId === characteristicId) {
            callback(res.value);
        }
    });
}

// 停止监听蓝牙特征值变化事件
function stopListening() {
    // 注意:uni-app没有直接提供移除特定事件监听器的API
    // 但你可以通过管理监听器的状态来避免处理不需要的事件
    // 例如,使用一个标志位来控制是否处理事件
    let isListening = false;

    // 由于uni-app没有提供移除特定回调的API,
    // 你可以通过重新注册一个空回调来“模拟”移除监听器(不推荐,因为这可能引发其他问题)
    // 或者,更优雅的做法是维护一个全局的监听器管理对象
    // 这里仅展示通过标志位控制的方式

    function onCharacteristicValueChange(res) {
        if (isListening) {
            // 处理特征值变化
            console.log('Characteristic value changed:', res.value);
            // 可以在这里调用你原本的回调
        }
    }

    // 重新注册监听器,但使用标志位来控制是否处理
    uni.onBLECharacteristicValueChange(onCharacteristicValueChange);

    // 停止监听时,设置标志位为false
    isListening = false;

    // 注意:这种方式并不是真正移除监听器,而是避免处理事件
    // 在实际开发中,需要谨慎管理事件监听器的生命周期
}

// 使用示例
startListening(value => {
    console.log('Received value:', value);
});

// 停止监听
stopListening();

请注意,上述代码中的stopListening函数并不是真正移除监听器,而是通过控制一个标志位来避免处理不需要的事件。在实际开发中,你需要根据自己的需求来管理事件监听器的生命周期。

回到顶部