You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android开发中MediaPlayer的onCompletionListener最佳放置位置咨询

MediaPlayer OnCompletionListener最佳放置位置解答

最佳放置位置

你应该把setOnCompletionListener放在play方法中MediaPlayer首次初始化的代码块内,也就是mediaPlayer=MediaPlayer.create(...)执行完成后的位置,仅在实例首次创建时设置一次即可。

修改后的play方法示例代码:

public void play(View v)
{
    if(mediaPlayer==null)
    {
        mediaPlayer=MediaPlayer.create(MainActivity.this,R.raw.music);
        // 仅在MediaPlayer实例首次创建时设置监听
        mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
            @Override
            public void onCompletion(MediaPlayer mp) {
                Toast.makeText(MainActivity.this, "音乐播放结束", Toast.LENGTH_SHORT).show();
            }
        });
    }
    mediaPlayer.start();
}

原因说明

  • OnCompletionListener是绑定到MediaPlayer实例的监听器,只要实例没有被销毁释放,设置一次就会全局生效,不需要每次触发播放操作都重复设置,避免冗余操作。
  • 不能放在onCreate方法中:此时mediaPlayer还没有完成初始化,值为null,直接设置监听会触发空指针异常,程序直接崩溃。
  • 不要放在if判断之外(也就是每次调用play都设置):重复设置相同的监听器没有任何实际作用,还会产生不必要的性能开销,完全多余。
  • 放在create之后设置可以保证监听器在实例生命周期内全程生效,所有播放完成的事件都能被正常捕获,不会出现漏触发的情况。

额外注意

你需要补充页面销毁时的资源释放逻辑,避免MediaPlayer长期持有Activity引用造成内存泄漏:

@Override
protected void onDestroy() {
    super.onDestroy();
    if (mediaPlayer != null) {
        mediaPlayer.release();
        mediaPlayer = null;
    }
}

内容的提问来源于stack exchange,提问作者Shubham Gawas

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 06:54:03