を介して音楽を再生するアクティビティがありMediaPlayer
ます。通常、曲を停止したいときは、MediaPlayerをに渡してCountDownTimer
、音量をゼロにフェードさせてから、MediaPlayerを解放します。ホームボタンに触れた後など、アクティビティが一時停止したときに問題が発生することを除けば、これは問題なく機能しているようです。
cancel()
でCountDownTimerを呼び出してonPause
いますが、アクティビティが一時停止しているため、CountDownTimerが破棄される前にメッセージを受信することはなく(?)、finish()
CountDownTimerのofは呼び出されないようです。
この結果、アプリケーションを終了した後も、CountDownTimerで最後に設定された音量で音楽が再生され続けますが、終了することはありません。そのため、MediaPlayerが実行されていて、アプリケーションを停止する方法がないため、アプリケーションが機能しなくなりました(非常に悪い)。
onFinish
キャンセルを呼び出しても、アクティビティの終了時にCountDownTimerが呼び出されないのは正常ですか?
これは私のコードです:
public void StopSong(boolean fadeout){
musicPlaying = false;
if(_player != null) {
final int fadeTime = 1000;
CountDownTimer timer = new CountDownTimer(fadeTime,50) {
final private MyMusicPlayer mFadePlayer = _player;
@Override
public void onTick(long millisUntilFinished) {
mFadePlayer.setFade((float)millisUntilFinished / (float)fadeTime);
Log.d("tag", "Fade timer " + millisUntilFinished+ "ms remaining.");
}
@Override
public void onFinish() {
mFadePlayer.stop();
mFadePlayer.release();
Log.d("tag", "Fade timer finished, releasing resource.");
}
};
timer.start();
mFadeTimers.add(timer);
Log.d("tag", "Song stopping, starting fade timer.");
_player = null;
}
}
そしてonPauseで:
for(CountDownTimer t : mFadeTimers){
Log.d("tag", "Cancelling fade timer on destroy.");
t.cancel();
}
mFadeTimers.clear();
すべてが正常に機能している場合は、「フェードタイマーのキャンセル」ログメッセージが表示され、続いて「フェードタイマーが終了し、解放されました」というメッセージが表示されますが、onFinish()
logcatメッセージは表示されません。
私はこれを見るだけです:
tag Song stopping, starting fade timer.
tag Application exiting, destroying all audio resources
tag Cancelling fade timer on destroy.
アクティビティを終了するときにすべてのカウントダウンタイマーを正常に中止するにはどうすればよいですか?