作为一个菜鸟,以前很少利用接口来监听一些操作的完成,最近写了一个应用,在PopupWindow中展示了录音文件,由于播放机制单独写出来了,然后在播放录音的时候关闭PopupWindow,然后再点开PopupWindow,PopupWindow中的listView中item播放的状态不能改变.所有只能在播放机制中写个接口等音乐播放完了通知适配器改变.
import android.media.AudioManager;
import android.media.MediaPlayer;
import android.media.MediaPlayer.OnCompletionListener;
public class AudioPlayer implements OnCompletionListener {
private static AudioPlayer instance;
public static AudioPlayer getInstance() {
if (instance == null || instance.mMediaPlayer == null) {
instance = new AudioPlayer();
}
return instance;
}
private AudioPlayer() {
mMediaPlayer = new MediaPlayer();
mMediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
mMediaPlayer.setLooping(false);
mMediaPlayer.setOnCompletionListener(this);
}
private MediaPlayer mMediaPlayer;
private boolean isPlaying = false;
//播放完成接口
private OnCompletionListener listener;
private String source;
@Override
public void onCompletion(MediaPlayer mp) {
isPlaying = false;
//播放完触发执行接口
if (listener != null) {
listener.onCompletion(mp);
}
}
public void play(String source) {
if (source == null) {
return;
}
if (source.equals(this.source)) {
if (isPlaying) {
pause();
} else {
play();
}
return;
}
try {
mMediaPlayer.reset();
mMediaPlayer.setDataSource(source);
mMediaPlayer.prepare();
this.source = source;
play();
} catch (Exception e) {
e.printStackTrace();
}
}
private void play() {
mMediaPlayer.start();
isPlaying = true;
}
public void stop() {
if (isPlaying) {
mMediaPlayer.stop();
mMediaPlayer.reset();
mMediaPlayer = null;
}
isPlaying = false;
}
public void pause() {
mMediaPlayer.pause();
isPlaying = false;
}
public boolean isPlaying() {
return isPlaying;
}
public void release() {
isPlaying = false;
mMediaPlayer.release();
mMediaPlayer = null;
}
//实现接口方法
public void setOnCompletionListener(OnCompletionListener listener) {
this.listener = listener;
}
}
调用如下:
import android.content.Context;
import android.media.MediaPlayer;
import android.media.MediaPlayer.OnCompletionListener;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.LinearLayout;
import android.widget.ListView;
import com.example.piano_app.adapter.AudioAdapter;
import com.example.piano_app.model.AudioPlayer;
public class AudioView extends LinearLayout {
private LayoutInflater inflater;
private Context context;
private View View;
private ListView listView;
private AudioAdapter adapter;
private PianoView pianoView;
public AudioView(Context context, PianoView pianoView) {
super(context);
this.context = context;
this.pianoView = pianoView;
initView();
addView(View);
}
private void initView() {
inflater = LayoutInflater.from(context);
View = inflater.inflate(R.layout.fragment_audio_layout, null);
listView = (ListView) View.findViewById(R.id.audio_list);
adapter = new AudioAdapter(context,pianoView);
listView.setAdapter(adapter);
}
@Override
protected void onAttachedToWindow() {
// TODO Auto-generated method stub
super.onAttachedToWindow();
//实现接口通知适配器改变
AudioPlayer.getInstance().setOnCompletionListener(
new OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp) {
adapter.notifyDataSetChanged();
}
});
}
@Override
protected void onDetachedFromWindow() {
super.onDetachedFromWindow();
//实现接口清空
AudioPlayer.getInstance().setOnCompletionListener(null);
}}
上面MediaPlayer本身就有个播放完成接口,所已就不要我们自己写了,下面自己写的接口:
public class SoundModel {
private static SoundModel instance;
public static SoundModel getInstance() {
if (instance == null) {
instance = new SoundModel();
}
return instance;
}
private SoundModel() {
}
private final List<RecordEvent> sounds = new ArrayList<RecordEvent>();
//播放录音
public void playSoundQueue(List<RecordEvent> sounds) {
if (sounds == null || sounds.isEmpty()) {
return;
}
isQueuePlaying = true;
handler.removeMessages(0);
this.sounds.clear();
this.sounds.addAll(sounds);
this.sounds.add(getEndEvent());
handler.sendEmptyMessageDelayed(0, sounds.get(0).getIntervalTime());
}
private RecordEvent getEndEvent() {
RecordEvent e = new RecordEvent();
e.setIntervalTime(100);
e.setPosition(-1);
return e;
}
public void stopPlaySoundQueue() {
isQueuePlaying = false;
handler.removeMessages(0);
//触发接口
if (mlistener != null) {
mlistener.getCompletion();
}
sounds.clear();
}
private Handler handler = new Handler() {
public void handleMessage(android.os.Message msg) {
Log.e("SoundModel", "播放队列中:" + sounds.size());
if (sounds.size() == 0) {
return;
}
RecordEvent event = sounds.remove(0);
if (!sounds.isEmpty()) {
handler.sendEmptyMessageDelayed(0, sounds.get(0)
.getIntervalTime());
} else {
Log.i("jjf", "停止");
isQueuePlaying = false;
//触发播放完成接口
if (mlistener != null) {
mlistener.getCompletion();
}
}
play(event.getType(), event.getPosition());
//触发开始播放接口
if (mCallBack != null) {
mCallBack.callback(event.getType(), event.getPosition());
}
};
};
//开始播放接口初始化
PlayQueueCallBack mCallBack;
//播放完成接口初始化
CompletionListener mlistener;
//开始播放接口的实现方法
public void setPlayQueueCallBack(PlayQueueCallBack mCallBack) {
this.mCallBack = mCallBack;
}
//播放完成接口的实现方法
public void setCompletionListener(CompletionListener mlistener) {
this.mlistener = mlistener;
}
public void release() {
mSoundPool.release();
mSoundPool = null;
}
//开始播放接口
public interface PlayQueueCallBack {
void callback(int type, int position);
}
//播放完成接口
public interface CompletionListener {
void getCompletion();
}
}