如何在android中控制计时器?

时间:2015-07-21 13:33:52

标签: android timer countdowntimer timertask

我想制作关于迷你游戏的应用程序。 细节:如果你没有回答或答案错误,你必须在2秒内回答问题 - >游戏结束 。但如果你的答案是真的,那么定时器将重置为0并再次倒计时带有不同的问题。

我已经在网站上看到很多关于计时器的代码,但我不清楚它:(

所以我想问:如何设置一个只运行2秒的计时器,我该如何重置它并继续提出新问题?

请帮帮我。

5 个答案:

答案 0 :(得分:1)

你可以在android中使用CountDownTimer:

 public class Myclass {
      myTimer timer =new myTimer(2000,1000);
     public void creatQuestion(){
         timer.start();
        //method you init question and show it to user
     }
     public void getUserAnswer(/*evry thing you expected*/)
     {
         //if answer is true call timer.start()
        //else call  timer.onFinish(); to run onfinish in timer
     }
    public class myTimer extends CountDownTimer {
          public myTimer(long millisInFuture, long countDownInterval) {
                super(millisInFuture, countDownInterval);
          }

          @Override
          public void onTick(long millisUntilFinished) {
               // you can update ui here
          }

         @Override
         public void onFinish() {
             this.cancel();
             //fire game over event
           }
    }

}

我希望它让你满意

答案 1 :(得分:0)

我使用Thread / Runnable完成了类似的操作。

Thread t = new Thread(new Runnable() {

    public void run() {
        final long startTime = getTime();
        final long maxEndTime = startTime + 2000L;
        try {
            while (shouldContinueWaiting()) {
                if (getTime() > maxEndTime) {
                    throw new TimeoutException();
                }
                sleep();
            }
        } catch (InterruptedException e) {
            handleInterrupt();
        } catch (TimeoutException e) {
            handleTimeout();
        }
    }


    boolean shouldContinueWaiting() {
        // Has the user already answered?
    }

    void handleInterrupt() {
        // The user has answered. Dispose of this thread.
    }

    void handleTimeout() {
        // User didn't answer in time
    }

    void sleep() throws InterruptedException {
        Thread.sleep(SLEEP_DURATION_IN_MILLIS);
    }

    void getTime() {
         return System.currentTimeMillis();
    }

然后您可以通过以下方式启动/重启线程:

t = new Thread(same as above...);
t.start();

并停下来:

t.interrupt();

答案 2 :(得分:-1)

您可以使用处理程序。

Handler h = new Handler();
h.postDelayed(new Runnable() {
    @Override
    public void run() {
        //this will happen after 2000 ms
    }
}, 2000);

答案 3 :(得分:-1)

也许这可以帮到你:

Handler handler = new Handler();
handler.post(new Runnable() {

@Override
public void run() {
    // FIRE GAME OVER
    handler.postDelayed(this, 2000); // set time here to refresh textView
}
});
  • 你可以在2000毫秒后解雇你的游戏。
  • 如果你的问题是正确的 - >从处理程序中删除回调并在下一个问题开始时重置它。

答案 4 :(得分:-1)

我们想要使用Timer类。

private Timer timer;

当你准备让计时器开始计时时 - 让我们说是你按下某个按钮后 - 这样做是为了启动计时器:

timer = new Timer();
timer.scheduleAtFixedRate(incrementTime(), 0, 100);

第一行是我们创建一个新的Timer。很标准。然而,第二行是我希望你看到的那一行。

incrementTime()是在时钟的每个“tick”结束时调用的方法。可以随意调用此方法,但必须返回TimerTask的实例。如果你愿意,你甚至可以创建一个匿名界面,但我更喜欢把它移到它自己的代码部分。

0是我们的起始位置。我们从这里开始计算。简单。

100是时钟的“滴答”大小(以毫秒为单位)。这里,它是每100毫秒,或每1/10秒。我在编写这段代码时使用了这个值,因为我正在制作一个秒表应用程序,我希望我的时钟每0.1秒更换一次。

至于你的项目,我建议让计时器的任务成为你的问题切换方法。每2000毫秒或2秒发生一次。