我正在创建一个媒体播放器应用。
当我启动或恢复应用程序时,我想检查媒体播放器是否已播放歌曲。
如果是,我会将暂停/播放ToggleButton
设置为暂停,否则之前没有播放,则按钮将设置为播放。
(例如,如果用户已经在使用媒体播放器并通过按下主页或后退按钮离开应用程序&现在他恢复播放器。则应正确配置按钮。)
实际的MediaPlayer对象在Service& amp;所有通信都是通过AIDL interface
方法完成的。
现在,
onResume
我正在调用AsynTask method
来检查所有内容
正在运行的服务并检查我的MusicService
是否也在运行。aidl method
以检查是否
mediaPlayer.isPlaying()
是否属实。toggleButton
将设置为暂停(即当前
玩),否则玩。 问题:
这个AsyncTask
正在创造竞争条件。有时它会像预期的那样运行。有时它会抛出错误
代码:
// In onResume
protected void onResume() {
new PlayerStatusCheck().execute();
}
//AsyncTask Class
class PlayerStatusCheck extends AsyncTask {
boolean isServiceAvailable;
private boolean isMyServiceRunning() {
ActivityManager manager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
for (RunningServiceInfo service : manager
.getRunningServices(Integer.MAX_VALUE)) {
if (com.example.playingworking.MusicService.class.getName()
.equals(service.service.getClassName())) {
return true;
}
}
return false;
}
@Override
protected Object doInBackground(Object... params) {
isServiceAvailable = isMyServiceRunning();
return null;
}
@Override
protected void onPostExecute(Object result) {
try {
if (!isServiceAvailable) {
doInBackground(null);
} else {
if (aidlObject.isMediaPlaying()) {
tbPlayPause.setChecked(true);
} else {
tbPlayPause.setChecked(false);
}
}
} catch (RemoteException e) {
Toast.makeText(MainActivity.this,
"MainActivity onPostExecute: " + e.toString(),
Toast.LENGTH_SHORT).show();
}
}
}
MusicService中的代码:
//In IBinder onBind()
public boolean isMediaPlaying(){
if(mediaPlayer.isPlaying()){
return true;
}
return false;
}
请建议......谢谢