uni-app 加速度计api uni.offAccelerometerChange取消监听方法无法正常使用 会导致开启再次进入页面叠加问题
uni-app 加速度计api uni.offAccelerometerChange取消监听方法无法正常使用 会导致开启再次进入页面叠加问题
示例代码:
uni.onAccelerometerChange(function (res) {}) 开启监听
uni.offAccelerometerChange(function (res) {}) 关闭监听(无法正常使用)
```
### 操作步骤:
在show方法添加 `uni.onAccelerometerChange(function (res) {})` 开启监听,推出这个页面在进就累计叠加。
`uni.offAccelerometerChange(function (res) {})` 关闭监听(无法正常使用)
### 预期结果:
退出此页面,需要取消这个api加速度计的监听,
### 实际结果:
会累积叠加此api,取消监听无法使用,报错不是一个function
### bug描述:
在app开发新功能使用到官方api 加速度计的api,
问题一:在b页面使用后,退出b页面在进b页面,`uni.onAccelerometerChange` 会叠加开启多个监听,如果在监听添加自己定义的接口请求,会同时执行多次。
问题二:使用这个api后在官方这个文档中有取消监听加速度数据`uni.offAccelerometerChange` 这个api,但是在代码中正常使用的时候找不到这个api,在打印`uni =`所有方法出来也没找到这个api方法。
| 信息类型 | 信息内容 |
|----------------|------------------|
| 产品分类 | uniapp/App |
| PC开发环境 | Windows |
| PC开发环境版本 | win 10 |
| HBuilderX类型 | 正式 |
| HBuilderX版本 | 3.2.12 |
| 手机系统 | Android |
| 手机系统版本 | Android 12 |
| 手机厂商 | 小米 |
| 手机机型 | 小米9pro |
| 页面类型 | vue |
| vue版本 | vue2 |
| 打包方式 | 离线 |
| 项目创建方式 | HBuilderX |



更多关于uni-app 加速度计api uni.offAccelerometerChange取消监听方法无法正常使用 会导致开启再次进入页面叠加问题的实战教程也可以访问 https://www.itying.com/category-93-b0.html
可升级至 3.2.16 使用,实测没有问题,offAccelerometerChange 和 onAccelerometerChange 传同一个方法即可
更多关于uni-app 加速度计api uni.offAccelerometerChange取消监听方法无法正常使用 会导致开启再次进入页面叠加问题的实战教程也可以访问 https://www.itying.com/category-93-b0.html
我安装了3.2.16sdk和hbx,但是发现offaccelerometerChange这个api还是无法使用销毁api,可以看看使用这个api的代码片段?
回复 1***@qq.com: 无法使用是什么意思?你传同一个方法即可销毁。你在 method 上定义的方法,监听的时候传入,销毁的时候也传入就行了
回复 DCloud_UNI_LXH: 最新sdk3.2.16和hbx3.2.16本地打包到手机似乎得到了解决
我也遇到了这个问题,看了这个帖子现在解决了
核心问题是 offAccelerometerChange 和 onAccelerometerChange 的callback要传同一个方法
你的示例代码里面,两个都是匿名函数
你换成同一个方法再试试,我是这么解决的
我在最新sdk本地打包到手机上就好像得到了解决
问题已经解决,借用前人方法。
监听和取消监听使用同样的方法,比如methods中定义的处理方法叫excute(res){…}
监听和取消监听就应该这么写:
// 监听
uni.onCompassChange(this.excute)
// 取消监听
uni.offCompassChange(this.excute)
根据你提供的信息,这个问题主要涉及两个关键点:
1. uni.offAccelerometerChange 方法不存在的问题
从你的截图和描述看,uni.offAccelerometerChange 方法确实不存在。在 uni-app 中,加速度计监听器的取消方法应该是:
// 正确的取消监听方式
uni.stopAccelerometer()
不是 uni.offAccelerometerChange。文档中可能表述有误,实际 API 是 uni.stopAccelerometer()。
2. 监听叠加问题的解决方案
针对监听叠加的问题,正确的使用模式应该是:
// 页面显示时开启监听
onShow() {
uni.startAccelerometer({
interval: 'game'
})
uni.onAccelerometerChange((res) => {
console.log('加速度数据:', res)
// 你的业务逻辑
})
}
// 页面隐藏时停止监听
onHide() {
uni.stopAccelerometer()
// 注意:不需要单独取消回调,stopAccelerometer会自动停止
}
// 或者使用页面卸载时停止
onUnload() {
uni.stopAccelerometer()
}

