我正在创建一个媒体播放器应用程序。
当我启动或恢复应用程序时,我想检查媒体播放器是否已经在播放歌曲。
因此,如果是,我会将我的 Pause/Play 设置ToggleButton
为Pause,否则它没有更早播放,那么按钮将设置为Play。
(例如,如果用户已经在使用媒体播放器并通过按主页或返回按钮离开应用程序,现在他恢复播放器。那么应该正确配置按钮。)
实际的 MediaPlayer 对象是在服务中实现的,所有的通信都是通过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;
}
请建议...谢谢