2***@qq.com
2***@qq.com
  • 发布:2025-12-11 15:55
  • 更新:2025-12-11 19:24
  • 阅读:23

offTimeUpdate 如何使用?

分类:uni-app

1、 如何调用offTimeUpdate来取消一个注册的 onTimeUpdate callback

2、 我看 audio 对象有一个 _callbacks ,里面有一个 onTimeUpdate,是一个数组,是否意味着可能创建多个 onTimeUpdate 函数?

3、 是否支持在APP端调用 offTimeUpdate 来取消注册?

4、目前测试,发现在部分 android 手机上,onTimeUpdate对应的任务队列,积压的任务会越来越多。而且 stop() 和 pause() 都无法阻止 onTimeUpdate 被调用

2025-12-11 15:55 负责人:无 分享
已邀请:
Ask小助手

Ask小助手

根据知识库内容回答:

  1. 调用方式:audio.offTimeUpdate(callback),需传入之前注册的相同callback函数来取消监听。例如:

    const audio = uni.createInnerAudioContext();  
    const timeUpdateHandler = () => { /* 处理逻辑 */ };  
    audio.onTimeUpdate(timeUpdateHandler);  
    // 取消监听  
    audio.offTimeUpdate(timeUpdateHandler);
  2. 是的,_callbacks.onTimeUpdate为数组结构,表明可以注册多个onTimeUpdate回调函数。每个回调独立执行,需用相同引用调用offTimeUpdate才能移除对应监听。

  3. 不支持APP端调用。知识库明确标注offTimeUpdate仅支持"微信小程序1.9.0+,支付宝小程序,抖音小程序、百度小程序",App(iOS/Android)平台未列入支持范围。

  4. 知识库未提及Android任务队列积压问题。根据音频API文档,stop()/pause()应停止时间更新,若仍持续触发可能是平台兼容性问题。建议:

    • 升级到最新版uni-app(正式版4.85)
    • 在回调内添加防重机制
    • 通过插件市场搜索音频优化插件:https://ext.dcloud.net.cn/search?q=audio

注意:鸿蒙平台需单独处理,不适用此API。

内容为 AI 生成,仅供参考
2***@qq.com

2***@qq.com (作者)

已升级到最新版本 HBuilderX 4.87, 还是不行

1、 发现华为平板没有问题。

2、 苹果手机,通过 stop() 方法可以阻止 timeupdate 事件,但是 pause() 方法不行;

我的另一部锤子手机,通过 stop() 和 pause() 方法都无法阻止 timeupdate 事件。 而且对于同一个音频URL, destroy() 音频后,重新createInnerAudioContext() 后,会发现有大量的 timeupdate 事件。

  1. 防重机制,无法解决 timeupdate 被大量触发的情况,系统逐渐卡顿
2***@qq.com

2***@qq.com (作者)

看了一下源码, 确实有问题

const onAudioStateChange = ({
state,
audioId,
errMsg,
errCode,
}: {
state: AudioEvnets
audioId: string
errMsg?: string
errCode?: unknown
}) => {
const audio = innerAudioContexts[audioId]
if (audio) {
emit(audio, state, errMsg, errCode)
if (state === 'play') {
const oldCurrentTime = audio.currentTime
emit(audio, 'timeUpdate' as any)
audio.__timing = setInterval(() => {
const currentTime = audio.currentTime
if (currentTime !== oldCurrentTime) {
emit(audio, 'timeUpdate' as any)
}
}, TIME_UPDATE)
} else if (state === 'pause' || state === 'stop' || state === 'error') {
clearInterval(audio.__timing!)
}
}
}

在定时器内部,没好友判断 state 是否为 paused,就直接 emit(audio, 'timeUpdate' as any) 了,会导致在 paused 状态下,仍然不断触发 timeudpate 事件。

注意,有些情况下,并没有把 定时器 clear 掉。

要回复问题请先登录注册