-1

因此,我在一些我从未完成过的旧 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 年前一样,这就是我过去编写程序的方式)。

所以我的主要问题是,有没有办法可以防止循环“崩溃”?

提前致谢!

4

4 回答 4

3

这不是一个循环,真的。这是一个递归调用。在每次递归中,都会分配更多的内存,所以它会在一段时间后内存不足。我想知道为什么这只是几秒钟的事情,但无论如何。尝试使用计时器来安排 gui 更新。

编辑:您在每次递归中创建一个新的 ImageIcon。它们在内存中可能相当大。或许它们就是快速“崩盘”的原因。

除此之外,我建议坚持 Java 命名约定。类名应以大写字母开头。

于 2015-07-11T06:50:16.190 回答
2

Thread.sleep(1000);不会是一个好的选择。您可以使用计时器。通过使用,Timer您可以定期安排任务。

  Timer timer = new Timer();
  long interval = (1000) ; // 1 sec

  timer.schedule( new TimerTask() {
       public void run() {
          //do your work;
       }
  }, 0, interval); 

如果要停止调度,可以使用timer.cancel();

编辑:正如菲尔多所说,我认为记忆是你的问题。以这种方式使用计时器,它应该可以解决您的问题。

于 2015-07-11T06:55:05.910 回答
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程序一开始就计算。最好只在需要时更新

于 2015-07-11T07:28:30.887 回答
-1

您的问题的答案是对要避免循环崩溃的功能使用设置超时功能。喜欢:

setTimeout(function()  {
    // write the logic
},1000);
于 2015-07-11T07:18:05.817 回答