uni-app ISO端 uni.createInnerAudioContext()中onTimeUpdate监听进度无法停止

uni-app ISO端 uni.createInnerAudioContext()中onTimeUpdate监听进度无法停止

开发环境 版本号 项目创建方式
Windows 10 HBuilderX
# 操作步骤:
* uni.createInnerAudioContext() ,先播放音频,然后暂停或销毁实例, onTimeUpdate监听进度依然一直监听,在HX控制台中一直在打印数据

# 预期结果:
* 音频暂停或销毁实例后,监听进度也需要同时取消

# 实际结果:
* 音频暂停或销毁实例后,监听进度在控制台中一直打印数据,直到关闭HX工具或退出APP

# bug描述:
* iOS端 uni.createInnerAudioContext() ,调用onPause暂停或销毁实例, onTimeUpdate监听数据时在HBuilderX控制台中可以看到数据一直没有停,除非关闭HBuilderX或退出APP重新启动

更多关于uni-app ISO端 uni.createInnerAudioContext()中onTimeUpdate监听进度无法停止的实战教程也可以访问 https://www.itying.com/category-93-b0.html

25 回复

用示例代码hello uni-app能出现你的问题吗?仅这个设备出现问题吗?其他设备是否正常?
【bug优先处理规则】https://ask.dcloud.net.cn/article/38139

更多关于uni-app ISO端 uni.createInnerAudioContext()中onTimeUpdate监听进度无法停止的实战教程也可以访问 https://www.itying.com/category-93-b0.html


已抽离出来示例代码,再次测试确认的确在暂停时或销毁播放器了还在控制台一直打印播放进度

回复 3***@qq.com: 直接用示例代码hello uni-app能出现你的问题吗?

回复 DCloud_UNI_Anne: 不好意思这几天不在线 才看到,实例代码也要修改为什NVUE才会出现, 我上面的代码是必现的, 我目前处理办法就是在监听进度条哪里判断避免一直在打印数据,可这个估计会影响到性能吧,

同样遇到了这个问题 暂停销毁后onTimeUpdate还是不停在打印数据

回复 3***@qq.com: 用HBuilderX3.6.0版本试下能复现此问题吗?

回复 DCloud_UNI_Anne: 从官方下载了 3.6.1 还是会一直打印 但是比我之前用的3.4好多

回复 DCloud_UNI_Anne: 跳出本页面还一直在打印 会导致app卡顿闪退等无法使用 请问有啥办法能让onTimeUpdate停止调用

回复 DCloud_UNI_Anne: 然后我写了个方法就是 如果当前路由不在我要展示音频的页面 onTimeUpdate每次都调用innerAudioContext.destroy() 销毁 然后就是无法销毁 destroy()一直在不停调用 onTimeUpdate也一直在不停调用

回复 3***@qq.com: 这边排查下

回复 DCloud_UNI_Anne: 好的 我这边的需求情景是 在一个页面切换了多条音频播放 不是单个音频播放出现的问题

回复 DCloud_UNI_Anne: 不确定单条音频能不能复现这个问题

回复 3***@qq.com: 你这是安卓正常?ios才复现吗?

回复 3***@qq.com: 为方便排查定位问题,也可提供下简单复现示例(上传附件)

回复 DCloud_UNI_Anne:安卓也会出现同样情况 只不过比ios稳定 复现示例我搞一下 就是快速的切换音频后会出现上述情况

示例代码

hbuilderX3.6.4 这个API在iphone7下真机测试有问题,只要play后,等待音乐播放结束。直接将手机锁屏,过两三分钟再解锁。会直接播放设置的音乐,且不触发onPlay事件。即使在onHide与onShow里销毁了实例对象也一样。

您好, 这个问题解决了吗? 这个肯定会影响 性能的吧。onTimeUpdate 一直在运行, 怎么取消这个? 安卓APP

以前我是NVUEIOS出现 安卓没有出现,都过了很多个版本了目前不知道什么情况,以前是onTimeUpdate中判断实例存在才做进度条处理避免报错,一直用到现在还没有发现什么别的问题

3.6.18问题依然存在

3.7.9问题还是存在

安卓 也会这样的问题,有时候stop 会多次触发,你们解决了吗?

极大的可能是你一个innerAudioContext 执行了 多次 play() 方法。这样就算是执行了一次pause() 歌曲停止了,但是因为执行了多个play(),没有全部停止,所以 onTimeUpdate 一直在运行

可是play的不是同一个音频实例吗 为什么切换url了 还是会执行多个onTimeUpdate

在 uni-app 中,uni.createInnerAudioContext() 用于创建音频播放器,并通过 onTimeUpdate 监听播放进度。如果你发现 onTimeUpdate 监听器无法停止,可能是因为你没有正确销毁或停止音频播放器。

以下是一些可能导致问题的原因以及解决方法:


1. 确保正确销毁音频播放器

当你不再需要音频播放器时,应该调用 destroy() 方法销毁它,否则 onTimeUpdate 会继续监听。

const innerAudioContext = uni.createInnerAudioContext();

// 监听播放进度
innerAudioContext.onTimeUpdate(() => {
    console.log('当前播放进度:', innerAudioContext.currentTime);
});

// 销毁音频播放器
innerAudioContext.destroy();

2. 暂停或停止音频播放器

如果你只是暂时不需要监听进度,可以暂停或停止音频播放器,而不是销毁它。

// 暂停播放
innerAudioContext.pause();

// 停止播放
innerAudioContext.stop();

3. 移除 onTimeUpdate 监听器

onTimeUpdate 是一个事件监听器,如果你不需要监听进度,可以直接移除它。

// 移除 onTimeUpdate 监听器
innerAudioContext.offTimeUpdate();

4. 检查是否重复创建音频播放器

如果你重复创建 innerAudioContext,可能会导致多个实例同时运行,onTimeUpdate 监听器也会被多次触发。确保每次只创建一个实例。

let innerAudioContext = null;

// 创建音频播放器
if (!innerAudioContext) {
    innerAudioContext = uni.createInnerAudioContext();
}

5. 检查是否在组件的生命周期中正确处理

如果你在组件中使用 innerAudioContext,确保在组件销毁时正确销毁音频播放器。

export default {
    data() {
        return {
            innerAudioContext: null
        };
    },
    created() {
        this.innerAudioContext = uni.createInnerAudioContext();
        this.innerAudioContext.onTimeUpdate(() => {
            console.log('当前播放进度:', this.innerAudioContext.currentTime);
        });
    },
    beforeDestroy() {
        if (this.innerAudioContext) {
            this.innerAudioContext.destroy();
        }
    }
};
回到顶部