uni-app 低功耗蓝牙使用 startBluetoothDevicesDiscovery 方法搜索蓝牙设备,当附近设备达到400个时,页面会非常卡,特别是 android14 版本的手机

uni-app 低功耗蓝牙使用 startBluetoothDevicesDiscovery 方法搜索蓝牙设备,当附近设备达到400个时,页面会非常卡,特别是 android14 版本的手机

操作步骤:

  • 在页面正常调用uni.startBluetoothDevicesDiscovery()。当附近设备很多的时候,(我的是400个),页面会很卡。

预期结果:

  • 页面不卡

实际结果:

  • 【报Bug低功耗蓝牙使用startBluetoothDevicesDiscovery方法搜索蓝牙设备,当附近设备达到400个时,页面会非常卡。特别是android14版本的手机

bug描述:

  • 【报Bug低功耗蓝牙使用startBluetoothDevicesDiscovery方法搜索蓝牙设备,当附近设备达到400个时,页面会非常卡。特别是android14版本的手机

| 信息类别           | 信息内容               |
|-------------------|-----------------------|
| 产品分类           | uniapp/App            |
| PC开发环境操作系统 | Windows               |
| PC开发环境版本号   | Windows10             |
| HBuilderX类型      | 正式                  |
| HBuilderX版本号    | 4.15                  |
| 手机系统           | Android               |
| 手机系统版本号     | Android 14            |
| 手机厂商           | 小米                  |
| 手机机型           | 小米                  |
| 页面类型           | vue                   |
| vue版本            | vue2                  |
| 打包方式           | 云端                  |
| 项目创建方式       | HBuilderX             |

更多关于uni-app 低功耗蓝牙使用 startBluetoothDevicesDiscovery 方法搜索蓝牙设备,当附近设备达到400个时,页面会非常卡,特别是 android14 版本的手机的实战教程也可以访问 https://www.itying.com/category-93-b0.html

2 回复

列表过多,进行更新时,重新渲染是会有性能问题,建议使用list组件

更多关于uni-app 低功耗蓝牙使用 startBluetoothDevicesDiscovery 方法搜索蓝牙设备,当附近设备达到400个时,页面会非常卡,特别是 android14 版本的手机的实战教程也可以访问 https://www.itying.com/category-93-b0.html


uni-app 中使用 startBluetoothDevicesDiscovery 方法搜索蓝牙设备时,当附近设备数量较多(如达到 400 个时),页面可能会非常卡顿,尤其是在 Android 14 版本的手机上。这种情况通常是由于以下几个原因造成的:

  1. 设备数量过多:每次发现新的蓝牙设备时,都会触发回调函数,设备数量过多会导致频繁的回调调用,占用大量 CPU 和内存资源,从而导致页面卡顿。

  2. UI 更新频繁:如果每次发现新设备时都更新 UI(例如列表渲染),会导致频繁的 UI 重绘,进一步加剧卡顿问题。

  3. Android 14 的性能问题:不同版本的 Android 系统在蓝牙管理、内存管理等方面的表现可能有所不同,Android 14 可能在处理大量蓝牙设备时性能不佳。

解决方案

1. 优化设备发现逻辑

  • 限制设备数量:可以在代码中设置一个最大设备数量的限制,超过该数量时停止扫描或不再处理新设备。

    let maxDevices = 100; // 设置最大设备数量
    let devices = [];
    
    uni.startBluetoothDevicesDiscovery({
      success: (res) => {
        uni.onBluetoothDeviceFound((result) => {
          if (devices.length < maxDevices) {
            devices.push(result.devices);
            // 更新 UI
          } else {
            uni.stopBluetoothDevicesDiscovery(); // 停止扫描
          }
        });
      }
    });
    
  • 去重处理:在设备发现回调中,对设备进行去重处理,避免重复添加和更新 UI。

    let devices = new Map();
    
    uni.onBluetoothDeviceFound((result) => {
      let device = result.devices[0];
      if (!devices.has(device.deviceId)) {
        devices.set(device.deviceId, device);
        // 更新 UI
      }
    });
    

2. 优化 UI 更新

  • 批量更新:不要每次发现新设备都立即更新 UI,可以设置一个定时器,每隔一段时间批量更新一次设备列表。

    let devices = [];
    let updateTimer = null;
    
    uni.onBluetoothDeviceFound((result) => {
      devices.push(result.devices[0]);
    
      if (!updateTimer) {
        updateTimer = setTimeout(() => {
          // 更新 UI
          devices = [];
          updateTimer = null;
        }, 1000); // 每隔 1 秒更新一次 UI
      }
    });
    
  • 虚拟列表:如果设备数量非常多,可以考虑使用虚拟列表技术,只渲染当前可见的设备,减少 DOM 操作。

3. 停止扫描

当设备数量达到一定数量时,停止扫描以减少资源占用。

uni.startBluetoothDevicesDiscovery({
  success: (res) => {
    uni.onBluetoothDeviceFound((result) => {
      if (devices.length >= maxDevices) {
        uni.stopBluetoothDevicesDiscovery(); // 停止扫描
      }
    });
  }
});
回到顶部