偶遇音乐播放器按钮设置图片响应事件监听,请求服务时出现异常,不能暂停播放歌曲,请且播放按钮的图片不能转变
经调试发现,因为请求了服务端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;
}
}