接口实例

作为一个菜鸟,以前很少利用接口来监听一些操作的完成,最近写了一个应用,在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();
	}

}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值