我正在创建一个使用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。这些是唯一的选择吗?
(正如@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。因此,无论您想要发生什么重复操作,请将代码放在那里。
资源:
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);
这已经是正确的,但你需要额外的参数,例如:
1000 millisecond
1000表示执行前2000 milliseconds
s的延迟,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;
}
将重复该任务。
这是我不久前为自己制作的回归方法。它需要java 5及以上我相信。很糟糕的是,你把很长一段时间放在millis中它会返回一个更容易阅读的完美格式的字符串,试试看:
qazxswpoi
很抱歉丑陋的代码格式化,我在移动设备上,有点难以让人看起来很好看,希望有人会编辑它。