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
相关产品推荐
相关产品推荐

