【问题标题】:CountDownTimer java equivalentCountDownTimer java等效
【发布时间】:2014-08-22 09:52:19
【问题描述】:

我正在制作一个使用 Twitter API 的应用程序。我可以在 180 次 API 调用后达到 API 限制,当我达到该限制时我想做的是启动一个计时器,该计时器将每 1 秒更新一次倒计时(jLabel),最重要的部分是计时器将在之后完成一定的 X 秒数(取自 API 调用)。

Android CountDownTimer 类是否有桌面 Java 替代方案?

我知道我可以这样做,但它似乎不合适:

time.scheduleAtFixedRate(new TimerTask() {
    long startTime = System.currentTimeMillis();
    @Override
    public void run() {
        if (System.currentTimeMillis() - startTime > X_SECONDS_HERE * 1000) {
            cancel();
        } else {
            // Update GUI countdown here
        }
}

另一种选择是使用带有 Thread.sleep() 的 SwingWorker。这些是唯一的选择吗?

【问题讨论】:

  • 如果更新 JLabel,请使用 Swing Timer 而不是 TimerTaskjava.util.Timer..

标签: java swing timer countdown


【解决方案1】:

(正如@AndrewThompson 指出的那样:)对于 Swing,您通常希望使用 javax.swing.Timer 而不是 java.util.Timer 或 TimerTask。原因是 Swing 是一个单线程框架,其中对 UI 的所有更新(在您的情况下为标签)都应该在 Event Dispatch Thread 上进行。使用 Swing 计时器,重复调用通过作用于 EDT 的ActionListener 进行。

Timer 的基本构造是:

Timer(int delay, ActionListener listener)

其中,delay 是初始和事件间延迟的毫秒数,侦听器在 actionPerformed 方法中保存回调功能。所以你有类似的东西

Timer timer = new Timer(1000, new ActionListener(){
    private int count = 100;

    @Override
    public void actionPerformed(ActionEvent e) {
        if (count == 0) {
            ((Timer)e.getSource).stop();
        } else {
            // decrement the count and set the text for the label
        }
    }
});
// start the timer with a call to timer.start()

使用上面的代码,对actionPerformed 的调用将每 100o 毫秒发生一次。所以无论你想重复什么动作,把代码放在那里。

资源:

【讨论】:

  • 我想这是最终的唯一方法..当然,除非我尝试创建一个 Timer 子类,我以后可能会尝试这样做。
【解决方案2】:

Java 文档有一个类似的 example 使用 Timer,因此您的代码看起来几乎正确:

final Timer timer = new Timer();
timer.scheduleAtFixedRate(new TimerTask() {
    int i = Integer.parseInt(args[0]);
    public void run() {
        System.out.println(i--);
        if (i< 0)
            timer.cancel();
    }
}, 0, 1000);

【讨论】:

    【解决方案3】:

    这已经是正确的,但是你需要额外的参数,例如:

    time.scheduleAtFixedRate(new TimerTask() {
        long startTime = System.currentTimeMillis();
        @Override
        public void run() {
            if (System.currentTimeMillis() - startTime > X_SECONDS_HERE * 1000) {
                cancel();
            } else {
                // Update GUI countdown here
            }
    }}, 1000,2000);
    

    1000 表示在执行前延迟1000 milliseconds,2000 表示每2000 milliseconds 重复一次任务。

    【讨论】:

      【解决方案4】:

      这是我不久前为自己制作的返回方法。它需要java 5 我相信。糟糕的是,你把很长的时间放在毫秒,它返回一个格式完美的字符串,更容易阅读,试试吧:

      public static String getTime(long time) {
          long timeToEdit = time;
          String textToDraw = "";
          if (TimeUnit.MILLISECONDS.toMinutes(time) >= 10) {
              textToDraw = textToDraw + TimeUnit.MILLISECONDS.toMinutes(time);
          } else {
              textToDraw = textToDraw + "0" + TimeUnit.MILLISECONDS.toMinutes(time);
          }
          timeToEdit -= TimeUnit.MINUTES.toMillis(TimeUnit.MILLISECONDS.toMinutes(timeToEdit));
          if (TimeUnit.MILLISECONDS.toSeconds(timeToEdit) >= 10) {
              textToDraw = textToDraw + ":" + TimeUnit.MILLISECONDS.toSeconds(timeToEdit);
          } else {
              textToDraw = textToDraw + ":0" + TimeUnit.MILLISECONDS.toSeconds(timeToEdit);
          }
          timeToEdit -= TimeUnit.SECONDS.toMillis(TimeUnit.MILLISECONDS.toSeconds(timeToEdit));
          if (TimeUnit.MILLISECONDS.toMillis(timeToEdit) >= 100) {
              textToDraw = textToDraw + ":" + TimeUnit.MILLISECONDS.toMillis(timeToEdit);
          } else if (TimeUnit.MILLISECONDS.toMillis(timeToEdit) >= 10) {
              textToDraw = textToDraw + ":0" + TimeUnit.MILLISECONDS.toMillis(timeToEdit);
          } else {
              textToDraw = textToDraw + ":00" + TimeUnit.MILLISECONDS.toMillis(timeToEdit);
          }
          return textToDraw;
      }
      

      抱歉,我在移动设备上的代码格式丑陋,很难让它看起来不错,希望有人会编辑它。

      【讨论】:

      • 哦,不知什么原因,我以为你想画时间,对不起
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-24
      • 1970-01-01
      • 1970-01-01
      • 2011-06-03
      • 2010-11-30
      相关资源
      最近更新 更多