计时器不停止



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

我正在尝试使用如下所示的计时器来执行此操作

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

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

现实中发生的事情是mLaunchNextQuestion被调用了不止一次。我猜这是因为计时器.cancel不起作用或计时器正在运行以快速取消?

更新---

感谢您关于刷新率太快的建议。我最终放弃了计时器,而是使用了一个在延迟后调用自己的可运行对象。

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

为什么要以 500Hz 运行此计时器? 这只是显示一个滴答声分数,对吧? 人眼看不到移动得那么快的物体。 实际上,它只记录 13Hz 之类的变化(取决于它的变化类型),所以通常,将该速率加倍(到 25Hz 或 30Hz)是安全的。

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

您也可以尝试在TimerTask上调用cancel(),尽管我认为在Timer上调用cancel()应该是有效的。

最新更新