Android MediaPlayer调用release方法失效 多次播放音频后无法使用如何解决
MediaPlayer资源释放不生效问题修复
您好,我按照教程实现MediaPlayer的资源释放逻辑,但释放操作不生效,多次播放音频后就无法再正常使用了,麻烦帮忙排查该如何修复?
我已经将音频raw资源存放在数组中,让MediaPlayer可以为每个列表项播放对应的音频,相关代码如下:
public class NumbersActivity extends AppCompatActivity { private MediaPlayer mMediaPlayer; private MediaPlayer.OnCompletionListener mOnComplitionListener = new MediaPlayer.OnCompletionListener() { @Override public void onCompletion(MediaPlayer mediaPlayer) { releaseMediaPlayer(); } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.word_list); final ArrayList<Word> words = new ArrayList<Word>(); words.add(new Word("one", "lutti", R.drawable.number_one, R.raw.number_one)); words.add(new Word("two", "otiiko", R.drawable.number_two, R.raw.number_two)); words.add(new Word("three", "tolookosu", R.drawable.number_three, R.raw.number_three)); words.add(new Word("four", "oyyisa", R.drawable.number_four, R.raw.number_four)); words.add(new Word("five", "massokka", R.drawable.number_five, R.raw.number_five)); words.add(new Word("six", "temmokka", R.drawable.number_six, R.raw.number_six)); words.add(new Word("seven", "kenekaku", R.drawable.number_seven, R.raw.number_seven)); words.add(new Word("eight", "kawinta", R.drawable.number_eight, R.raw.number_eight)); words.add(new Word("nine", "wo'e", R.drawable.number_nine, R.raw.number_nine)); words.add(new Word("ten", "na'aacha", R.drawable.number_ten, R.raw.number_ten)); WordAdapter wordAdapter = new WordAdapter(this, words, R.color.category_numbers); ListView listView = (ListView) findViewById(R.id.list); listView.setAdapter(wordAdapter); listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> adapterView, View view, int position, long l) { releaseMediaPlayer(); Word word = words.get(position); MediaPlayer mMediaPlayer = MediaPlayer.create(NumbersActivity.this, word.getmAudio()); mMediaPlayer.start(); mMediaPlayer.setOnCompletionListener(mOnComplitionListener); } }); } private void releaseMediaPlayer() { // If the media player is not null, then it may be currently playing a sound. if (mMediaPlayer != null) { // Regardless of the current state of the media player, release its resources // because we no longer need it. mMediaPlayer.release(); // Set the media player back to null. For our code, we've decided that // setting the media player to null is an easy way to tell that the media player // is not configured to play an audio file at the moment. mMediaPlayer = null; } } }
问题原因
代码在onItemClick方法中重复声明了局部变量mMediaPlayer,导致全局成员变量mMediaPlayer始终为null,releaseMediaPlayer方法从未真正执行资源释放,多次播放后MediaPlayer资源被占满就会无法正常使用。
修复方案
将onItemClick方法中的如下代码:MediaPlayer mMediaPlayer = MediaPlayer.create(NumbersActivity.this, word.getmAudio());
修改为:mMediaPlayer = MediaPlayer.create(NumbersActivity.this, word.getmAudio());
去掉局部变量声明,直接为全局成员变量赋值即可。
内容的提问来源于stack exchange,提问作者val9
相关产品推荐
相关产品推荐

