首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >为什么我的CountDownTimer计数速度快于给定的参数?

为什么我的CountDownTimer计数速度快于给定的参数?
EN

Stack Overflow用户
提问于 2014-12-10 06:00:19
回答 2查看 581关注 0票数 0

我的CountDownTimer有问题。情况是这样的:我不使用框架(谁需要一个框架,对不对?)(咳嗽)我有一个CountDownTimer跑步。此CountDownTimer用于计算玩家完成一个级别的时间,并在每100毫秒的滴答中更新屏幕。

在第一级,这很好,但在第二层,它每50毫秒滴答滴答,在第三层,每60/90/50毫秒滴答(是的,按重复顺序),使游戏行为公正和混乱的碰撞。我不知道这里发生了什么。

我已经排除了它是否依赖于级别,首先加载以后的级别,而在解决这些问题时,问题仍然会上升。然而,我已经指出了它的错误所在:在加载一个新级别的过程中,并且只有在那时;即使重新加载当前级别也不会导致这个错误。

我怀疑在这段代码中,有些东西并没有达到应有的效果:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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();
}

级别、动产、img_move和img_noMove是列表项。

这是我的计时器:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
MyCount update = new MyCount(15*1000, 100);

这是MyCount:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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()函数的末尾调用。我最初以为我有两个计时器同时运行,但写信给LogCat显示这是错误的,这意味着我每15秒收到一条整洁的“重置”消息,而不是在小于15秒的多个时刻。

这基本上就是问题所在。现在我知道它是在哪里引起的,问题是什么,我该如何解决呢?

-Zubaja

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-12-10 06:09:31

您可以启动多个CountDownTimer吗?尝试在启动新的CountDownTimer之前停止现有的CountDownTimer。

票数 0
EN

Stack Overflow用户

发布于 2014-12-10 06:46:18

尝试使用计时器代替CountDownTimer:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  // 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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27402914

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文