实现音乐播放器,多线程处理进度条

	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		
		File musicDir=Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MUSIC);
		file=new File(musicDir,"朴树 - 白桦林.mp3");
		seekBar=(SeekBar) findViewById(R.id.seekBar1);
		currentTv=(TextView) findViewById(R.id.TextView01);
		durationTv=(TextView) findViewById(R.id.TextView02);
		seekBar.setOnSeekBarChangeListener(this);
		mHandler=new MainHandler();//默认当前线程Looper
	}
	enum States{STOP,PAUSE}
	States state=States.STOP;
	private MediaPlayer mPlayer;
	private SeekBarThread barThread;


	/**实现音乐的播放*/
	public void onMusicPlay(View v){
		//判定播放器对象是否为空,为null则创建新的对象
		if(mPlayer==null){
			mPlayer=new MediaPlayer();
			mPlayer.setOnPreparedListener(this);
			mPlayer.setOnCompletionListener(this);
		}
		//判定媒体播放状态,假如是暂停则直接启动播放
		if(state==States.PAUSE){
			mPlayer.start();
			return;
		}
		//假如不是暂停状态则设置要播放的音乐路径,加载音乐
		try{
			mPlayer.setDataSource(file.getPath());
			mPlayer.prepareAsync();//工作线程加载
		}catch(Exception e){e.printStackTrace();}
		//更新seekBar
		if(barThread==null){
			barThread=new SeekBarThread();
			barThread.start();
		}
	}
	private boolean isUpdate=true;
	/**负责给主线程发消息,更新SeekBar的线程对象*/
	class SeekBarThread extends Thread{
		@Override
		public void run() {
			while(isUpdate){
				try{sleep(1000);}catch(Exception e){}
				mHandler.sendEmptyMessage(1);
			}
		}
	}
	/**实现进度条*/
	private SimpleDateFormat sdf=new SimpleDateFormat("mm:ss");
	class MainHandler extends Handler{
		public MainHandler() {}
		public MainHandler(Looper looper) {super(looper);}
		@Override
		public void handleMessage(Message msg) {
			if(msg.what==1&&mPlayer!=null){
				int cPos=mPlayer.getCurrentPosition();//获取当前位置 
				seekBar.setProgress(cPos);//setMax是设置 进度条的最大值,setProgress是设置进度条的当前进度。
			}
		}
	}
	/**实现音乐的暂停*/
	public void onMusicPause(View v){
		if(mPlayer!=null&&mPlayer.isPlaying()){
			mPlayer.pause();
			state=States.PAUSE;
		}
	}
	@Override
	protected void onDestroy() {
		super.onDestroy();
		isUpdate=false;
		if(mPlayer!=null){
			mPlayer.release();
			mPlayer=null;
		}
	}
	/**当音乐加载完成以后会执行此方法*/
	@Override
	public void onPrepared(MediaPlayer mp) {
		Log.i("TAG", "onPrepared");
		mp.start();
		//getDuration()获取歌曲长度,毫秒
		durationTv.setText(sdf.format(new Date(mPlayer.getDuration())));
		seekBar.setMax(mPlayer.getDuration());
	}
	@Override
	public void onCompletion(MediaPlayer mp) {//Completion 结束
		Log.i("TAG", "onCompletion");
		mp.start();
	}
	/**以下是设置seekBar监听,实现接口后自动添加的*/
	@Override
	public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
		currentTv.setText(sdf.format(new Date(mPlayer.getCurrentPosition())));
	}
	@Override
	public void onStartTrackingTouch(SeekBar seekBar) {
		// TODO Auto-generated method stub
	}
	@Override
	public void onStopTrackingTouch(SeekBar seekBar) {
		if(mPlayer!=null){
			int cPos=seekBar.getProgress();
			//实现跳转到要播放的位置的功能!
			mPlayer.seekTo(cPos);
		}
	}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值