CountDownTimer等价于java

问题描述 投票:1回答:4

我正在创建一个使用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。这些是唯一的选择吗?

java swing timer countdown
4个回答
2
投票

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

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

使用上面的代码,每隔100毫秒就会调用How to use Swing Timers。因此,无论您想要发生什么重复操作,请将代码放在那里。

资源:


2
投票

Java文档使用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); ,所以你的代码看起来几乎是正确的:

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

1
投票

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

1000 millisecond

1000表示执行前2000 millisecondss的延迟,2000年每个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; } 将重复该任务。


-1
投票

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

qazxswpoi

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

© www.soinside.com 2019 - 2024. All rights reserved.