android 如果在活动暂停时调用cancel(),则不会调用CountDownTimer onFinish()

qvtsj1bj  于 2023-04-28  发布在  Android
关注(0)|答案(1)|浏览(144)

我有一个通过MediaPlayer播放一些音乐的Activity。通常当我想停止歌曲时,我会将MediaPlayer传递给CountDownTimer,将音量渐变为零,然后释放MediaPlayer。这似乎工作正常,除了当我的Activity暂停时出现问题,例如在触摸home按钮后。
我在onPause中的CountDownTimer上调用cancel(),但似乎由于活动暂停,CountDownTimer在销毁(?)之前从未接收到消息,因此CountDownTimer的finish()未被调用。
这样做的结果是,在退出应用程序后,音乐继续以CountDownTimer中最后设置的音量播放,但它永远不会结束。所以现在我被困在我的应用程序中,MediaPlayer正在运行,没有办法停止它(非常糟糕)。
当Activity退出时,CountDownTimer不被调用onFinish,即使我调用了cancel,这正常吗?
这是我的代码:

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.

如何在退出活动时成功中止所有倒计时器?

piztneat

piztneat1#

看看source code,你会发现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();

相关问题