所以我正在挖掘一些我从未完成过的旧Java项目,我拿出了这个有史以来最好的项目的小数字。
它是一个用java编码的桌面时钟小部件,它除了一件事外它的工作原理非常好。我的方式检查当前保持更新的时间是在一个循环和循环"崩溃"在几秒钟内,小部件就不再获得当前时间。
这是循环的构造方式(缩小尺寸):
public class getCurrentTime {
public static void getTime() throws InterruptedException {
int hour = global.calendar.get(Calendar.HOUR);
int minute = global.calendar2.get(Calendar.MINUTE);
if(hour == 0) {
global.hour.setIcon(new ImageIcon("resources/hours/12.png"));
}else if(hour == 23) {
global.hour.setIcon(new ImageIcon("resources/hours/11.png"));
}else {
global.hour.setText("?");
}
if(minute == 0) {
global.minute.setIcon(new ImageIcon("resources/minutes/00.png"));
}else if(minute == 59) {
global.minute.setIcon(new ImageIcon("resources/minutes/59.png"));
}else {
global.minute.setText("?");
}
Thread.sleep(1000);
getTime();
}
}
global
是一个我保留大部分变量的课程(我知道它很奇怪,这就像3年前一样,它是我如何使用的写我的节目)。
所以我的主要问题是,是否有一种方法可以阻止循环"崩溃"?
提前致谢!
答案 0 :(得分:3)
这不是一个循环,真的。这是一个递归调用。在每次递归中,将分配更多的内存,因此它会在一段时间后内存不足。我想知道为什么这只是几秒钟,但无论如何。 尝试使用Timer来安排gui更新。
编辑:您正在每次递归中创建一个新的ImageIcon。它们在记忆中可能相当大。也许他们是快速“崩溃”的原因。
除此之外,我建议坚持使用java命名约定。班级名称应以大写字母开头。
答案 1 :(得分:2)
Thread.sleep(1000);
不是一个好选择。您可以使用Timer。通过使用Timer
,您可以定期安排任务。
Timer timer = new Timer();
long interval = (1000) ; // 1 sec
timer.schedule( new TimerTask() {
public void run() {
//do your work;
}
}, 0, interval);
如果您想停止日程安排,可以使用timer.cancel();
编辑:正如Fildor所说,我认为记忆是你的问题。以这种方式使用计时器,它应该可以解决您的问题。
答案 2 :(得分:0)
这是第一个解决方案
class clockUpdater implements Runnable {
@Override
public void run() {
Thread.sleep(WAIT_TILL_NEW_MINUTE);
while(true){ //a infinite loop
// the Swing call below must be queued onto the Swing event thread
SwingUtilities.invokeLater(new Runnable(){
@Override
public void run() {
//your clock updating code here
}
});
try {
Thread.sleep(1000*60);//you only need to update once after a minute
} catch (InterruptedException e) {
// ....
}
}
}
}
这是第二次
class clockUpdater extends Thread{
@Override
public void run(){
Thread.sleep(WAIT_TILL_NEW_MINUTE);
while(true){
try{
//your update code here
Thread.sleep(60*1000)//
}
catch(Exception e){
//..
}
}
}
}
注意:一旦系统时间发生变化,您需要立即启动此功能。或者时钟时间会落后。程序启动后立即计算WAIT_TILL_NEW_MINUTE
。 最好只在需要时更新。
答案 3 :(得分:-1)
你的问题的答案是 使用设置超时功能 你想避免循环崩溃。 像:
setTimeout(function() {
// write the logic
},1000);