【发布时间】:2018-12-04 10:35:55
【问题描述】:
我有一个 RecyclerView,我在其中添加元素并可以单击它们来播放声音。如果我在 Adapter 类中创建所有 MediaPlayer 方法,所有内容都会被正确释放,并且一次只会播放一个音频。
//this works (code in the adapter class)
private MediaPlayer mMediaPlayer;
//release if not playing
public void releaseMediaPlayer() {
// if no sound is playing
if (mMediaPlayer != null) {
Log.d("rEEEEEEEEEEEEEEEEEEE", "releaseMediaPlayer: ");
mMediaPlayer.release();
mMediaPlayer = null;
}
}
//release media player on sound finish
public MediaPlayer.OnCompletionListener mCompletionListener = new MediaPlayer.OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mediaPlayer) {
releaseMediaPlayer();
}
};
// on click listener code
releaseMediaPlayer();
mMediaPlayer = MediaPlayer.create(context, word.getmAudioResourceId());
mMediaPlayer.start();
mMediaPlayer.setOnCompletionListener(mCompletionListener);
但是,如果我使用单独的类,每当我调用 release 方法时,它不会在开始时释放,因此会同时播放多个声音。它在完成时正常释放
public class MediaPlay {
private MediaPlayer mMediaPlayer;
public void setmMediaPlayer(MediaPlayer mMediaPlayer) {
this.mMediaPlayer = mMediaPlayer;
}
public MediaPlayer getmMediaPlayer() {
return mMediaPlayer;
}
//release if not playing
public void releaseMediaPlayer() {
// if no sound is playing
if (mMediaPlayer != null) {
Log.d("rEEEEEEEEEEEEEEEEEEEEEEEEEEE", "releaseMediaPlayer: ");
mMediaPlayer.release();
mMediaPlayer = null;
}
}
//release media player on sound finish
public MediaPlayer.OnCompletionListener mCompletionListener = new MediaPlayer.OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mediaPlayer) {
releaseMediaPlayer();
}
};
}
使用类时的onclicklistener
final MediaPlay m = new MediaPlay();
m.releaseMediaPlayer();
m.setmMediaPlayer(MediaPlayer.create(context, word.getmAudioResourceId()));
m.getmMediaPlayer().start();
m.getmMediaPlayer().setOnCompletionListener(m.mCompletionListener);
我尝试在 clickListener 之外创建 MediaPlay 对象,但没有结果。我基本上是在尝试创建一个单独的类,这样我就可以从我的活动中调用它,这样我就可以在 onStop 方法中停止声音。 任何意见将不胜感激。
使用点击监听器编辑 1 个完整的视图
MediaPlay m;
public ViewHolder(@NonNull View itemView) {
super(itemView);
//play specific sound for each list item
itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Log.d("ViewHolder: ", String.valueOf(getAdapterPosition()));
Word word = Words.get(getAdapterPosition());
if (word.hasAudio()) {
/*releaseMediaPlayer(); // stop multiple playbacks at once
mMediaPlayer = MediaPlayer.create(context, word.getmAudioResourceId());
mMediaPlayer.start();
mMediaPlayer.setOnCompletionListener(mCompletionListener); //cleanup*/
if (m != null)
m.releaseMediaPlayer();
m = new MediaPlay();
//m.releaseMediaPlayer(); //TODO still plays duplicate sounds, release method not working when called like this
m.setmMediaPlayer(MediaPlayer.create(context, word.getmAudioResourceId()));
m.getmMediaPlayer().start();
m.getmMediaPlayer().setOnCompletionListener(m.mCompletionListener);
}
}
});
name = itemView.findViewById(R.id.nameT);
type = itemView.findViewById(R.id.typeT);
img = itemView.findViewById(R.id.imgV);
}
【问题讨论】:
标签: java android android-mediaplayer