已确认在某些 andrioid 系统上存在定时器泄露,具体代码在这个位置
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!)
}
}
audio.__timing 在创建定时器之间没有判断是否有定时器存在。 没有干掉之前的定时器。
最终在 timeupdate 中打印 audio.__timing,会发现如下连续出现多个定时器ID,例如出现了 28, 29. 30, 那么 28, 29 定时器就永远留在系统中了。
从应用开发角度,只能自己保存所有看到过的定时器ID,然后自己清理
4 个回复
Ask小助手
根据知识库内容回答:
调用方式:
audio.offTimeUpdate(callback),需传入之前注册的相同callback函数来取消监听。例如:是的,
_callbacks.onTimeUpdate为数组结构,表明可以注册多个onTimeUpdate回调函数。每个回调独立执行,需用相同引用调用offTimeUpdate才能移除对应监听。不支持APP端调用。知识库明确标注offTimeUpdate仅支持"微信小程序1.9.0+,支付宝小程序,抖音小程序、百度小程序",App(iOS/Android)平台未列入支持范围。
知识库未提及Android任务队列积压问题。根据音频API文档,stop()/pause()应停止时间更新,若仍持续触发可能是平台兼容性问题。建议:
注意:鸿蒙平台需单独处理,不适用此API。
2***@qq.com (作者)
已升级到最新版本 HBuilderX 4.87, 还是不行
1、 发现华为平板没有问题。
2、 苹果手机,通过 stop() 方法可以阻止 timeupdate 事件,但是 pause() 方法不行;
我的另一部锤子手机,通过 stop() 和 pause() 方法都无法阻止 timeupdate 事件。 而且对于同一个音频URL, destroy() 音频后,重新createInnerAudioContext() 后,会发现有大量的 timeupdate 事件。
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 掉。
2***@qq.com (作者)
已确认在某些 andrioid 系统上存在定时器泄露,具体代码在这个位置
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!)
}
}
audio.__timing 在创建定时器之间没有判断是否有定时器存在。 没有干掉之前的定时器。
最终在 timeupdate 中打印 audio.__timing,会发现如下连续出现多个定时器ID,例如出现了 28, 29. 30, 那么 28, 29 定时器就永远留在系统中了。
从应用开发角度,只能自己保存所有看到过的定时器ID,然后自己清理
要回复问题请先登录或注册
公告
更多>相关问题