计时器不会停止

时间:2012-08-13 09:47:30

标签: android

基本上,当用户赢得游戏时,我想要从原始分数到新分数进行动画(计数)。

我尝试使用计时器执行此操作,如下所示

    public final void updatePlayerScore(final int newScore){ 
      final Timer t = new Timer();
      TimerTask tt = new TimerTask() {
        @Override
        public void run() {
            mHandler.post(new Runnable() {
                    public void run() {
                        initialScore++;
                            // update TextView
                        scoresTextView.setText("" + initialScore);
                        if(initialScore >= newScore){
                            t.cancel();
                            mHandler2.postDelayed(mLaunchNextQuestion,1000);
                        }
                    }
           });
    }
};


t.scheduleAtFixedRate(tt, 0, 2); 

当initialScore等于或大于newScore时,每次调用TimerTask时,初始分数都会向上递增(它每2毫秒) - 它应取消定时器,然后加载新的活动mLaunchNextQuestion。

现实中发生的事情是,mLaunchNextQuestion不止一次被调用。我猜这是因为timer.cancel无法正常工作或者计时器正在快速取消?

UPDATE ---

感谢有关刷新率过快的建议。我最终放弃了计时器,而是使用了一个在延迟后调用自己的runnable。

private Runnable updatePlayerScoreNew(final int newScore){

    Runnable aRunnable = new Runnable(){
        public void run(){
            if (initialScore >= newScore) {
                mHandler.postDelayed(mLaunchNextQuestion,1000);
            } else {
                initialScore+=40;
                if(initialScore > newScore){
                    scoresTextView.setText("" + newScore);
                }else{
                    scoresTextView.setText("" + initialScore);
                }
                mHandler.postDelayed(updatePlayerScoreNew(newScore), 40);
            }
        }
    };

    return aRunnable;
}

1 个答案:

答案 0 :(得分:2)

为什么你在500Hz下运行这个定时器?这只是显示一个滴答分数,对吧?人眼无法看到快速移动的东西。实际上,它只记录13Hz的变化(取决于它的变化类型),所以通常,将速率加倍(25Hz或30Hz)是安全的。

但是,500Hz是过度的。尝试将速率设置为较慢的速度,然后看看会发生什么。

You can also try calling cancel() on the TimerTask,虽然我认为在cancel()上调用Timer应该有效。