2017-02-23 72 views
1

我正在編寫一個Java浮油遊戲,我想添加一個消息管理。應該有一個ArrayList包含所有尚未發送的消息。每2秒鐘應顯示列表中的下一個項目。Java浮油;延遲後運行命令無循環;

我的邏輯:

在更新梅索德應顯示所述第一消息。 2秒後該物品被移除。

我的問題是,只是第一個顯示,其他沒有。當我調試時,我注意到,在這2秒鐘後,計時器繼續移除第一個項目而沒有2秒的中斷。

請你幫助我找到問題或更好的邏輯。

這是我的一些編碼。

Mothode將消息放入隊列

public static void showMessage(String message){ 
    msgHandler.addMessage(message); 
} 

渲染梅索德

public void render(GameContainer gameContainer, Graphics g) throws SlickException { 
    msgHandler.getCurrentMessage().displayMessage(g); 
    if(msgHandler.isTimerCompleted()){ 
     msgHandler.next(); 
    } 
} 

消息管理器類

public class MessageHandler { 
    private ArrayList<Message> messages; 
    private int duration = 2000; 
    private Timer timer = new Timer(); 
    private boolean isTimerCompleted = true; 

    public MessageHandler() { 
     messages = new ArrayList<>(); 
    } 

    public void next() { 

     isTimerCompleted = false; 
     timer.schedule(new TimerTask() { 
      @Override 
      public void run() { 
       if (messages.size() > 0) { 
        messages.remove(0); 
       } 
       System.out.println("test"); 
      } 
     }, duration); 
     isTimerCompleted = true; 
    } 

    public Message getCurrentMessage() { 
     if (messages.size() > 0) 
      return messages.get(0); 
     return new Message(""); 
    } 

    public void addMessage(String message, int x, int y) { 
     messages.add(new Message(message, x, y)); 
    } 

    public void addMessage(String message) { 
     messages.add(new Message(message)); 
    } 
} 

回答

0

它看起來像你想要使用一個循環定時器,如下面的例子。 此外,timer.schedule不會暫停執行,直到定時器結束,而是在時間限制結束時執行定時器的run()部分。目前,isTimerCompleted = true;將在您創建計時器後立即執行。

timer.scheduleAtFixedRate(new TimerTask() { 
    @Override 
    public void run() { 
    // Your database code here 
    } 
}, 2*60*1000, 2*60*1000); 

一個很好的概述是在這裏: https://stackoverflow.com/a/4044793/1320066

編輯:

更清晰,「isTimerCompleted =真」正在只要你的計時器任務已創建執行,所以你有效地持續創建新的TimerTasks。嘗試移動「isTimerCompleted = true;」到「public void run(){..}」代碼塊的內部。

對於所發生的事情的一個例子,嘗試運行的代碼,這個簡單的部分按照什麼順序執行的語句來進行:

import java.util.TimerTask; 
import java.util.Timer; 

public class TimerSchedule { 

    public Timer timer = new Timer(); 

    public void TestTimerSchedule() { 
     System.out.println("Before timer.schedule"); 
     timer.schedule(new TimerTask() { 
      @Override 
      public void run() { 
       System.out.println("TimerTask"); 
      } 
     }, 2000); 

     System.out.println("After timer.schedule"); 
    } 

} 

輸出:

Before timer.schedule 
After timer.schedule 
TimerTask 
+0

我想你明白這一點錯誤。每次函數被調用時都應該有2秒的延遲,然後從列表中刪除消息。 我的問題是,第一次定時器完成後,run方法中的所有內容都會不斷執行。它正在循環。但我希望運行方法不是無限循環。 – Lorenz

+0

嗨,我已經更新了我的答案,要更具體些,請讓我知道你的想法。 –

+0

非常感謝!它已經工作了! 祝您有美好的一天。 – Lorenz