26

I would like to do a timer, it will be restarted when something happens:

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); 
}  

I have a problem when I create the new schedule, I have this error:

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)

I don't know how can I do it! Thanks!

user1256477
  • 10,763
  • 7
  • 38
  • 62

2 Answers2

17

This works fine for me... can you paste the full code and error?

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);
    }
}

This outputs:

 MAC: 123ipAddress:127.0.0.1
 Updated timer
Eran Medan
  • 44,555
  • 61
  • 184
  • 276
  • So sorry! it was some kind of mistake, I thought I pasted the mistake! 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) – user1256477 Apr 26 '12 at 15:04
  • 8
    You can't cancel and reschedule a TimerTask. You have to create a new instance of the TimerTask each time you schedule it. That is why the code in this answer works, and the code snippet in the question does not. – pavon Jan 30 '14 at 20:48
  • I have a requirement inside broadcast receiver with respect to same. Can I perform the below operations inside onReceive method of BroadcastReceiver? – Siva May 31 '20 at 06:36
  • And also when I try to initialise some thing like this in the class reference ReminderReceiver reminderReceiver = new ReminderReceiver(); it says ava.lang.StackOverflowError: stack size 8MB at com.nagra.uk.jado.LocalNotifications.ReminderReceiver.(ReminderReceiver.java:20) at com.nagra.uk.jado.LocalNotifications.ReminderReceiver.(ReminderReceiver.java:25) – Siva May 31 '20 at 06:38
8

You have to create a new TimerTask object everytime you restart the Timer. So, create a new one on Start. And Destroy the Timer with "Timer.cancel" and "Timer.purge".

For eg, I have two Buttons - Start and 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();
}
});
ARK
  • 3,734
  • 3
  • 26
  • 29