4

を介して音楽を再生するアクティビティがあり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.

アクティビティを終了するときにすべてのカウントダウンタイマーを正常に中止するにはどうすればよいですか?

4

1 に答える 1

18

ソースコードを見てください。cancel()が呼び出されないことがわかりますonFinish()。これは、CountDownTimerが設計されている方法です。

あなたは自分自身を呼ぶことができますonFinish()

for(CountDownTimer t : mFadeTimers){
    Log.d("tag", "Cancelling fade timer on destroy."); // ought to read "in onPause", right?
    t.cancel();
    t.onFinish();
}
mFadeTimers.clear();
于 2012-10-20T20:59:32.830 に答える