2012-04-26 35 views
17

Tôi muốn làm một bộ đếm thời gian, nó sẽ được khởi động lại khi có điều gì xảy ra:khởi động timer trong java

public static Timer timer; 

public myTimer(long MAC, String ipAddress){ 
    timer = new Timer(); 
    timer.schedule(timerTask, 120000); 
} 

public void update(){ 
    timer.cancel(); 
    timer = new Timer(); 
    timer.schedule(timerTask, 120000); 
} 

Tôi có một vấn đề khi tôi có thể tạo lịch trình mới, tôi có lỗi này:

java.lang.IllegalStateException: Task already scheduled or cancelled 
    at java.util.Timer.sched(Timer.java:358) 
    at java.util.Timer.schedule(Timer.java:170) 
    at spb.keepAliveTimer.update(keepAliveTimer.java:37) 
    at spb.keepAlive.update(keepAlive.java:58) 
    at spb.receptor.keepAlive(receptor.java:475) 
    at spb.receptor.run(receptor.java:118) 
    at java.lang.Thread.run(Thread.java:662) 

Tôi không biết làm cách nào tôi có thể làm được! Cảm ơn!

+4

lỗi là gì? – NPE

+0

quên dán lỗi? –

+0

và xóa timer = new Timer(); không nên cần thiết – ControlAltDel

Trả lời

13

Điều này phù hợp với tôi ... bạn có thể dán mã đầy đủ và lỗi không?

package snippet; 

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

public class Main { 
    public static Timer timer; 

    public static void main(String[] args) { 
     Main main = new Main(); 
     main.myTimer(123, "127.0.0.1"); 


    } 

    public void myTimer(final long MAC, final String ipAddress) { 
     TimerTask timerTask = new TimerTask() { 

      @Override 
      public void run() { 
       System.out.println("MAC: " + MAC + "ipAddress:" + ipAddress); 
       update(); 
      } 
     }; 
     timer = new Timer(); 
     timer.schedule(timerTask, 1000); 

    } 

    public void update() { 
     TimerTask timerTask = new TimerTask() { 

      @Override 
      public void run() { 
       System.out.println("Updated timer"); 

      } 
     }; 
     timer.cancel(); 
     timer = new Timer(); 
     timer.schedule(timerTask, 2000); 
    } 
} 

đầu ra này:

 
MAC: 123ipAddress:127.0.0.1 
Updated timer 
+0

Rất tiếc! đó là một loại sai lầm, tôi nghĩ rằng tôi đã dán sai lầm! java.lang.IllegalStateException: Tác vụ đã được lên lịch hoặc hủy tại java.util.Timer.sched (Timer.java:358) tại java.util.Timer.schedule (Timer.java:170) tại spb.keepAliveTimer. cập nhật (keepAliveTimer.java:37) tại spb.keepAlive.update (keepAlive.java:58) tại spb.receptor.keepAlive (receptor.java:475) tại spb.receptor.run (receptor.java:118) tại java.lang.Thread.run (Thread.java:662) – user1256477

+0

Nó làm việc cho tôi! Cảm ơn nhiều! – user1256477

+4

Bạn không thể hủy và lên lịch lại TimerTask. Bạn phải tạo một phiên bản mới của TimerTask mỗi khi bạn lên lịch cho nó. Đó là lý do tại sao mã trong câu trả lời này hoạt động và đoạn mã trong câu hỏi không. – pavon

6

Bạn phải tạo một đối tượng mọi TimerTask mới bạn khởi động lại Timer. Vì vậy, hãy tạo một cái mới khi bắt đầu. Và Destroy the Timer với "Timer.cancel" và "Timer.purge".

Đối với ví dụ, tôi có hai Buttons - Start và Stop

mStartButton.setOnClickListener(new View.OnClickListener() { 
public void onClick(View v) { 
mTimerTask = new TimerTask();//This creates new TimerTask 
timer = new Timer(); //Instantiate again, as we Cancel the Timer 
timer.schedule(mTimerTask, 0, 30); 
} 
}); 

mEndButton.setOnClickListener(new View.OnClickListener(){ 
public void onClick(View v){ 
timer.cancel(); 
timer.purge(); 
} 
});