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交互:第八步:调用这个接口进行播放

<span style="white-space:pre">			</span>//<span style="color:#ff0000;">这里对服务Service端的播放接口请求第一次,此时播放器由播放状态进入暂停状态,并且返回值是false,但没有接收</span>
			Log.v("tag", "mIMusicService.iPlayerMusic()" + "------->" + mIMusicService.iPlayerMusic() + "\n");
<span style="white-space:pre">			</span>
<span style="white-space:pre">			</span>//<span style="color: rgb(255, 0, 0); font-family: Arial, Helvetica, sans-serif;">这里对服务Service端的播放接口请求第二次,此时播放器由暂停状态进入播放状态,并且返回值true,这里接收</span>
			boolean playstate = mIMusicService.iPlayerMusic();

			Logs.v("playstate>>>>>>>>" + playstate + "\n");//<span style="color:#ff0000;">此处值为true</span>
			if (playstate == true) {
				<span style="color:#ff0000;">//所以一直执行这里的的代码,就不能变成暂停图片</span>
<span style="white-space:pre">				</span>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;
		}
	}



改进之后


<pre name="code" class="html"><span style="font-size:18px;">@Override
	public void onClick(View v) {
		switch (v.getId()) {
		case R.id.the_play_song_img:
			 服务Activity交互:第八步:调用这个接口进行播放
<span style="white-space:pre">			</span><span style="color:#ff0000;">//这里是第一次请求服务端接口播放音乐的方法,得到回传值为false,执行将播放按钮图片设置播放的图片</span>
			boolean playstate = mIMusicService.iPlayerMusic();
			Logs.v("playstate>>>>>>>>" + playstate + "\n");
			if (playstate == true) {
				mPlayPauseImg.setImageResource(R.drawable.player_pause);
				Logs.v("playstate==true" + "设置暂停图片");
			} else {
				<span style="color:#ff0000;">//执行此处设置图片</span></span>
<span style="font-size:18px;"><span style="white-space:pre">				</span>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;
		}
	}</span>


 

贴出服务端播放方法

// 服务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;
		}
	}



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值