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        |

![示例图片1](https://www.itying.com/uniimg.php?url=https://img-cdn-tc.dcloud.net.cn/uploads/questions/20211220/445832567b4f7d73a1c51c32aeceaf28.jpeg)
![示例图片2](https://www.itying.com/uniimg.php?url=https://img-cdn-tc.dcloud.net.cn/uploads/questions/20211220/76b08ce8a8a0e8c78aff494ee99f4e7f.jpeg)
![示例图片3](https://www.itying.com/uniimg.php?url=https://img-cdn-tc.dcloud.net.cn/uploads/questions/20211220/43bd0c5a3ca51ba3e3226a5b3a3fc25a.jpeg)

更多关于uni-app 加速度计api uni.offAccelerometerChange取消监听方法无法正常使用 会导致开启再次进入页面叠加问题的实战教程也可以访问 https://www.itying.com/category-93-b0.html

8 回复

可升级至 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()
}
回到顶部