Somnus040
Somnus040
  • 发布:2025-06-25 13:17
  • 更新:2025-06-25 18:57
  • 阅读:67

项目内莫名出现类似抢占资源的错误,还找不到是哪里

分类:uni-app x

我这是一个蓝牙的uni-appx的项目,选项式。里面涉及到接收蓝牙的数据,之后显示,还设置到echart的应用。有一个连接蓝牙的页面,连接完我会返回上一页,上一页就涉及显示蓝牙数据。之后就会偶尔出现下面图片的错误,我尝试把所有相关ref,蓝牙数据显示,读取的地方注释掉,还是会偶尔出现,有遇到类似的情况的么,怎么解决的呢,出现这个问题就会导致莫名的UI错误。严重的时候页面都用不了了。只有安卓,ios平台就不会出现

2025-06-25 13:17 负责人:无 分享
已邀请:
DCloud_UNI_HT

DCloud_UNI_HT

不知道你代码啥样,只能根据这个错误信息猜测一下,看你报错大概是一个 并发修改异常,多线程环境下对数组之类的数据进行迭代修改时出现了问题 。排查建议:

  1. 简化数据流 ,暂时移除复杂逻辑,仅保留蓝牙连接和基础数据展示,然后观察报错
  2. 关键代码添加注释,确认你的修改是不是发生在主线程。响应式数据更新必须在主线程,蓝牙数据回调可能在子线程触发,需要强制切换到主线程,例:
    // 假设这是蓝牙数据回调函数 ,伪代码,具体要看你代码如何实现的  
    function onBluetoothDataReceived(data) {  
    // 强制切换到主线程  
    uni.$nextTick(() => {  
    this.bluetoothData.push(data); // 安全更新响应式数据  
    });  
    }
  3. 如果无法复现问题,可以尝试压力测试,就是连续连接断开蓝牙设备,触发高频数据接收来复现问题。

如果数据量大的情况下 ,使用JSON.parse(JSON.stringify(data))也是可能会出现性能问题的。看看代码中是否有此类大码。

  • Somnus040 (作者)

    确实这个原因,因为我用了蓝牙插件,当中包括发送数据成功,接收数据,连接成功的等回调,可能插件内部这些回调在子线程,我现在将这些回调全部切换到主线程,没有发现类似的问题了,谢谢

    2025-06-28 11:08

要回复问题请先登录注册