2011-12-23 95 views
3

我工作的GWT + JAVA。延遲循環使用GWT定時器

我有一段在GWT代碼如下

static int DELAY = 1000; 

private void downloadAttachments(final List<String> ftIdList) 
{ 
    try 
    { 
     Timer timer = new Timer() 
     { 
     @Override 
     public void run() 
     { 
      int cnt = 1; 
      for (String url: ftIdList) 
      { 
       String windowName = "win" + cnt; 
       Window.open(url, windowName, ""); 
       cnt++; 
       scheduleRepeating(DELAY*2); 
      } 
      cancel(); 
     } 
     }; 
     timer.run(); 
    } 
    catch (Throwable exc) 
    { 
     Window.alert(exc.getMessage()); 
    } 
} 

我需要打開多個窗口,允許用戶下載的所有文件。

我打電話的servlet。

我如何引入循環延遲,直到下一次迭代?

回答

8

計數器的狀態下面是解決方案,在相同的風格MAKS建議通過使用屬性保持計數器的狀態。你仍然有不同的方式循環。

private void downloadAttachments(final List<String> ftIdList) { 
    final int size = ftIdList.size(); 

    Timer timer = new Timer() { 

     private int counter = 0; 

     @Override 
     public void run() { 
     if (counter == size) { 
      cancel(); 
      return; 
     } 
     String url = ftIdList.get(counter); 
     String winName = "win" + counter; 
     Window.open(url, winName, ""); 
     counter++; 
     } 
    }; 
    timer.scheduleRepeating(2000); 
} 
+2

GWT定時器不能安排兩次 - 至少在第一個預定事件觸發之前。調用timer.scheduleRepeating(2000)內部調用cancel(),它取消了第一個調度(500)。 – djjeck 2012-05-23 23:19:03

+0

@djjeck你是對的。答案已更新。謝謝。 – 2012-06-25 13:35:25

+0

+1個不錯的工作。今天這幫助了我。 – 2013-04-01 12:19:20

0

你需要調用timer.scheduleRepeating(5000)例如。它會每5秒鐘呼叫run方法。你可以寫你的運行方式,不會對循環和保存變量

+0

嗨MAKS ..感謝快速回復。我編輯了我的帖子。我延遲了2秒。我需要運行,直到列表大小,這就是爲什麼我寫循環 – 2011-12-23 12:36:32

+0

好吧..我有提示..但是什麼時候該停止計時器。你能否提供任何提示 – 2011-12-23 12:45:32