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
列表过多,进行更新时,重新渲染是会有性能问题,建议使用list组件
更多关于uni-app 低功耗蓝牙使用 startBluetoothDevicesDiscovery 方法搜索蓝牙设备,当附近设备达到400个时,页面会非常卡,特别是 android14 版本的手机的实战教程也可以访问 https://www.itying.com/category-93-b0.html
在 uni-app
中使用 startBluetoothDevicesDiscovery
方法搜索蓝牙设备时,当附近设备数量较多(如达到 400 个时),页面可能会非常卡顿,尤其是在 Android 14 版本的手机上。这种情况通常是由于以下几个原因造成的:
-
设备数量过多:每次发现新的蓝牙设备时,都会触发回调函数,设备数量过多会导致频繁的回调调用,占用大量 CPU 和内存资源,从而导致页面卡顿。
-
UI 更新频繁:如果每次发现新设备时都更新 UI(例如列表渲染),会导致频繁的 UI 重绘,进一步加剧卡顿问题。
-
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(); // 停止扫描
}
});
}
});