为什么我的CountDownTimer计数比给定参数快?

时间:2014-12-10 14:00:19

标签: android countdowntimer

我的CountDownTimer存在问题。情况如下: 在游戏上工作,我没有使用框架(谁需要一个,对吧?咳嗽)我运行了CountDownTimer。此CountDownTimer用于计算玩家必须完成一个级别的时间,并且还会每100毫秒勾选一次更新屏幕。

在第一级,这可以正常工作,但在第二级,它每50ms滴答一次,在第三级每60/90 / 50ms滴答(是的,按顺序重复)使游戏表现得很糟糕并且搞乱了碰撞。 我不知道这里发生了什么。

我已经排除了它是否依赖于水平,首先加载后来的水平,并且一​​旦解决了这些问题就会产生相同的问题。 但是,我已经确定了它出错的地方:在装载新级别时,只有这样;即使重新加载当前级别也不会带来这个错误。

我怀疑在这段代码中有些东西是不应该的:

public void prepareNewLevel(){  
    RelativeLayout rl = (RelativeLayout)findViewById(R.id.game);

    level.clear();
    movables.clear();
    img_move.clear();
    img_noMove.clear();
    timerCount.cancel();
    totalSolved = 0;
    solvable = 0;
    levelWidth = 0;
    levelHeight = 0;
    allCollided = false;
    firstDraw = true;

    rl.removeAllViewsInLayout();
}

级别,movings,img_move和img_noMove 是列表项。

这是我的计时器:

MyCount update = new MyCount(15*1000, 100);

这是MyCount:

public class MyCount extends CountDownTimer{

    public MyCount(long millisInFuture, long countDownInterval) {
        super(millisInFuture, countDownInterval);

    }

    @Override
    public void onTick(long millisUntilFinished) {
        remaining_time = millisUntilFinished;

        if(!loadingNewLevel)
            MoveObjects();
    }

    @Override
    public void onFinish() {
        resetLevel = true;
        upMotion = false;
        downMotion = false;
        leftMotion = false;
        rightMotion = false;
        update.start();
    }
}

然后我还在 loadLevel()函数的末尾调用 update.start()。我首先想到我有两个定时器同时运行,但写入LogCat显示我是假的,因为我每隔15秒就得到一条整齐的“重置”消息,而不是在15秒以内的多个时刻。

这基本上就是问题所在。既然我知道它在哪里以及问题是什么,我该如何解决呢?

-Zubaja

2 个答案:

答案 0 :(得分:1)

尝试使用Timer而不是CountDownTimer:

  // start timer inside your method
  if( timer != null)  timer.cancel();
  timer = new Timer();
  timer.scheduleAtFixedRate( new TimerTask()
   {
     @Override
     public void run()
      {
        handler.obtainMessage( yourInegerMessage).sendToTarget();
      }
   }, 100, 15000);      

  // and define you handler
  public Handler handler = new Handler( new Handler.Callback()
   {
     @Override
     public boolean handleMessage( Message message)
      {
        // use 'message.what' as yourInegerMessage
        // ...
        return true;
      }
   });

  // and stop your timer after first time

可能会帮助你。

答案 1 :(得分:0)

可能是你开始更多的CountDownTimer?尝试在启动新的CountDownTimer之前停止现有的CountDownTimer。