Android Activity与Service交互,startservice,bindService多媒体播放器音乐播放暂停按钮请求服务设置按钮图片问题



偶遇音乐播放器按钮设置图片响应事件监听,请求服务时出现异常,不能暂停播放歌曲,请且播放按钮的图片不能转变

经调试发现,因为请求了服务端service的对应接口的方法两次,造成参数没发生变化,再点击音乐播放列表歌曲,进入播放状态,当点击暂停按钮时,这是第一次请求,但此处是采用打Logs的形式请求服务,服务端根据正在播放状态,将播放状态设置为暂停状态,并且返回一个false给Activity设置播放按钮图片,

而我在接下来得一行又在采用赋值的形式请求服务,此时服务端音乐播放器已经是暂停状态,Service服务端又把媒体播放器设置为播放状态,并且通过接口返回的参数是true,也就造成在极短时间内播放器短暂暂停,无法实现真正暂停播放,参数经过两次请求,就造成未发生变换,就没办法设置播放按钮图片的变化,解决办法就是把打Log中的请求服务的代码屏蔽掉,不能请求多次。

先将前后代码贴出。

Activity端

@Override
	public void onClick(View v) {
		switch (v.getId()) {
		case R.id.the_play_song_img:
			//// 服务Activity交互:第八步:调用这个接口进行播放

			//这里对服务Service端的播放接口请求第一次,此时播放器由播放状态进入暂停状态,并且返回值是false,但没有接收
			Log.v("tag", "mIMusicService.iPlayerMusic()" + "------->" + mIMusicService.iPlayerMusic() + "\n");
			
			//这里对服务Service端的播放接口请求第二次,此时播放器由暂停状态进入播放状态,并且返回值true,这里接收
			boolean playstate = mIMusicService.iPlayerMusic();

			Logs.v("playstate>>>>>>>>" + playstate + "\n");//此处值为true
			if (playstate == true) {
				//所以一直执行这里的的代码,就不能变成暂停图片
				mPlayPauseImg.setImageResource(R.drawable.player_pause);
				Logs.v("playstate==true" + "设置暂停图片");
			} else {
				mPlayPauseImg.setImageResource(R.drawable.player_play);
				Logs.v("playstate==true" + "设置播放图片");
			}
			break;
		case R.id.the_last_song_img:

			mIMusicService.iPlaylast();
			mPlayPauseImg.setImageResource(R.drawable.player_pause);
			break;
		case R.id.the_next_song_img:

			mIMusicService.iPlayNext();
			mPlayPauseImg.setImageResource(R.drawable.player_pause);
			break;

		default:
			break;
		}
	}



改进之后


@Override
	public void onClick(View v) {
		switch (v.getId()) {
		case R.id.the_play_song_img:
			//// 服务Activity交互:第八步:调用这个接口进行播放
			//这里是第一次请求服务端接口播放音乐的方法,得到回传值为false,执行将播放按钮图片设置播放的图片
			boolean playstate = mIMusicService.iPlayerMusic();
			Logs.v("playstate>>>>>>>>" + playstate + "\n");
			if (playstate == true) {
				mPlayPauseImg.setImageResource(R.drawable.player_pause);
				Logs.v("playstate==true" + "设置暂停图片");
			} else {
				//执行此处设置图片
				mPlayPauseImg.setImageResource(R.drawable.player_play);
				Logs.v("playstate==true" + "设置播放图片");
			}
			break;
		case R.id.the_last_song_img:

			mIMusicService.iPlaylast();
			mPlayPauseImg.setImageResource(R.drawable.player_pause);
			break;
		case R.id.the_next_song_img:

			mIMusicService.iPlayNext();
			mPlayPauseImg.setImageResource(R.drawable.player_pause);
			break;

		default:
			break;
		}
	}


 
  

贴出服务端播放方法

// 服务Activity交互:第一步
	public interface IMusicService {
		public boolean iPlayerMusic();

		public int iPlayCurrentTime();

		public int iPlayTotalTime();

		public void iSeekTo(int msec);

		public void iPlaylast();

		public void iPlayNext();
	}

	// 服务Activity交互:第二步
	public class MusicServiceBinder extends Binder implements IMusicService {

		@Override
		public boolean iPlayerMusic() {
			return musicPlayer();
		}
      }

public boolean musicPlayer() {
		if (mMediaPlayer.isPlaying()) {
			mMediaPlayer.pause();
			Logs.v("暂停已执行");
			return false;
		} else {
			mMediaPlayer.start();
			return true;
		}
	}



你可能感兴趣的:(Android)