You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Android在线音乐播放器播放服务器音频时应用卡顿问题排查

解决在线音乐播放器点击播放卡顿的问题

嘿,你的问题很典型——卡顿的根源是你在主线程里执行了阻塞式的音频准备操作!让我给你拆解一下:

问题分析

你代码里的mp.prepare()是同步方法,当Voice是网络音频链接时,这个方法会在主线程里等待音频数据加载完成才会返回,这就直接导致了UI卡顿1-2秒。主线程是负责处理UI交互的,绝对不能在这里做耗时的网络/IO操作!

解决方案

把同步的prepare()换成异步的prepareAsync(),并通过OnPreparedListener监听准备完成的事件,这样音频准备工作会在后台线程执行,不会阻塞主线程。同时还要优化MediaPlayer的生命周期管理,避免异常。

修改后的代码示例:

// 先给MediaPlayer设置准备监听器
mp.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
    @Override
    public void onPrepared(MediaPlayer mediaPlayer) {
        // 准备完成后再开始播放
        mediaPlayer.start();
        // 更新UI状态
        detail_voice.setVisibility(View.GONE);
        detail_voice_stop.setVisibility(View.VISIBLE);
    }
});

detail_voice.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        Snackbar snackbar = Snackbar.make(detail_date, " 丿丕乇賲 賲蹖诏蹖乇乇乇乇乇乇乇乇乇賲卮 :| :)))", Snackbar.LENGTH_SHORT);
        snackbar.show();
        try {
            mp.reset(); // 先重置状态
            mp.setDataSource(Voice);
            mp.prepareAsync(); // 异步准备,不会阻塞主线程
        } catch (IOException e) {
            e.printStackTrace();
            // 这里可以添加加载失败的提示,比如Snackbar告知用户
        }
    }
});

detail_voice_stop.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        detail_voice.setVisibility(View.VISIBLE);
        detail_voice_stop.setVisibility(View.GONE);
        if (mp.isPlaying()) {
            mp.stop();
        }
        mp.reset();
        // 你原来的代码里重复设置了一次detail_voice_stop.setVisibility(View.GONE),这里去掉冗余操作
    }
});

额外优化建议

  • 添加加载状态提示:比如在点击播放后显示一个ProgressBar,直到onPrepared回调触发再隐藏,让用户知道应用在工作,不是卡住了。
  • 处理MediaPlayer的异常情况:比如网络错误、音频链接无效时,给用户友好的提示,而不是只打印日志。
  • 记得在页面销毁时释放MediaPlayer资源,避免内存泄漏:mp.release();

内容的提问来源于stack exchange,提问作者shombol tala

火山引擎 最新活动