Вопрос по java – таймер перезапуска в Java [дубликат]

20

This question already has an answer here:

Java Timer 3 answers

Я хотел бы сделать таймер, он будет перезапущен, когда что-то произойдет:

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

У меня есть проблема, когда я создаю новое расписание, у меня есть эта ошибка:

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)

Я не знаю, как я могу это сделать! Спасибо!

и удалить таймер = новый таймер (); это не должно быть необходимо ControlAltDel
забыл вставить ошибку? Ivaylo Strandjev
новый Timer () необходим, потому что иначе не будет потока. Thomas Jensen
В чем ошибка? NPE
Пожалуйста, также включите timerTask (и какой длинный MAC-параметр для? Не видит, что он используется) Eran Medan

Ваш Ответ

2   ответа
7

Вы должны создавать новый объект TimerTask каждый раз, когда вы перезапускаете Timer. Итак, создайте новый на старте. И уничтожить таймер с помощью «Timer.cancel» и & quot; Timer.purge & quot ;.

Например, у меня есть две кнопки - Пуск и Стоп

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

Это прекрасно работает для меня ... вы можете вставить полный код и ошибку?

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

Это выводит:

 MAC: 123ipAddress:127.0.0.1
 Updated timer
Это сработало для меня! Большое спасибо! user1256477
Вы не можете отменить и перенести TimerTask. Вы должны создавать новый экземпляр TimerTask каждый раз, когда вы планируете его. Вот почему код в этом ответе работает, а фрагмент кода в вопросе - нет.
Так жаль! это была какая-то ошибка, я думал, что вставил ошибку! java.lang.IllegalStateException: задача уже запланирована или отменена в java.util.Timer.sched (Timer.java:358) в java.util.Timer.schedule (Timer.java:170) в spb.keepAliveTimer.update (keepAliveTimer. java: 37) в spb.keepAlive.update (keepAlive.java:58) в spb.receptor.keepAlive (восприимчиво: java:475) в spb.receptor.run (рецептор.java:118) в java.lang.Thread. бежать (Thread.java:662) user1256477

Похожие вопросы