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

时间:2012-10-20 20:47:49

标签: android android-activity countdowntimer

我有一个通过MediaPlayer播放音乐的活动。通常,当我想要停止播放歌曲时,我将MediaPlayer传递给CountDownTimer,将音量淡化为零,然后释放MediaPlayer。这似乎工作得很好,除了我的活动暂停时遇到问题,例如在触摸主页按钮后。

我正在cancel()中的CountDownTimer上调用onPause,但似乎由于活动正在暂停,因此CountDownTimer在销毁之前从不接收消息(?),因此{不调用CountDownTimer的{1}}。

这样做的结果是,在退出应用程序后,音乐将继续以CountDownTimer中最后设置的任何音量播放,但它永远不会结束。所以现在我已经停止运行MediaPlayer的应用程序,无法阻止它(非常糟糕)。

当活动退出时,CountDownTimer不会被调用finish()是否正常,即使我调用了取消?

这是我的代码:

onFinish

在onPause中:

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;
    }
}

如果一切正常,我会看到“取消淡入淡出定时器”日志消息,然后是“淡化定时器已完成,释放”,但我从未收到 for(CountDownTimer t : mFadeTimers){ Log.d("tag", "Cancelling fade timer on destroy."); t.cancel(); } mFadeTimers.clear(); logcat消息。

我只是看到了这个:

onFinish()

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

1 个答案:

答案 0 :(得分:13)

看看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();