接口实例

来源:互联网 发布:vb与matlab混合编程 编辑:程序博客网 时间:2024/05/21 04:17

作为一个菜鸟,以前很少利用接口来监听一些操作的完成,最近写了一个应用,在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;@Overridepublic 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);}@Overrideprotected void onAttachedToWindow() {// TODO Auto-generated method stubsuper.onAttachedToWindow();//实现接口通知适配器改变AudioPlayer.getInstance().setOnCompletionListener(new OnCompletionListener() {@Overridepublic void onCompletion(MediaPlayer mp) {adapter.notifyDataSetChanged();}});}@Overrideprotected 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();}}


0 0
原创粉丝点击