メディア プレーヤー アプリを作成しています。
アプリケーションを開始または再開するときに、メディア プレーヤーが既に曲を再生しているかどうかを確認したいと考えています。
だった場合は Pause/PlayToggleButton
をPauseに設定し、それ以外の場合は以前に再生していなかった場合、ボタンはPlayに設定されます。
(たとえば、ユーザーが既にメディア プレーヤーを使用していて、ホームまたは戻るボタンを押してアプリを終了し、プレーヤーを再開した場合、ボタンは正しく構成する必要があります。)
実際の MediaPlayer オブジェクトは Service に実装され、すべての通信は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;
}
提案してください...ありがとう