看了一下源码, 确实有问题
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 掉。
3 个回复
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 掉。
要回复问题请先登录或注册
公告
更多>相关问题