Ответ 1
Если вы уже отменили один таймер, вы не можете его повторно запустить, вам нужно будет создать новый.
См. этот ответ, он содержит видео и исходный код, как я сделал что-то подобное.
В принципе существует два метода: пауза и возобновление
В паузе:
public void pause() {
this.timer.cancel();
}
В резюме:
public void resume() {
this.timer = new Timer();
this.timer.schedule( aTask, 0, 1000 );
}
Это делает восприятие паузы/возобновления.
Если ваши таймеры выполняют разные действия в зависимости от состояния приложения, вы можете использовать StatePattern
Fist определяет абстрактное состояние:
abstract class TaskState {
public void run();
public TaskState next();
}
И укажите как можно больше состояний. Ключ состоит в том, что одно состояние приводит вас к другому.
class InitialState extends TaskState {
public void run() {
System.out.println( "starting...");
}
public TaskState next() {
return new FinalState();
}
}
class FinalState extends TaskState {
public void run() {
System.out.println("Finishing...");
}
public TaskState next(){
return new InitialState();
}
}
И затем вы изменяете состояние в своем таймере.
Timer timer = new Timer();
TaskState state = new InitialState();
timer.schedule( new TimerTask() {
public void run() {
this.state.run();
if( shouldChangeState() ) {
this.state = this.state.next();
}
}
}, 0, 1000 );
Наконец, если вам нужно выполнить одно и то же, но с разной скоростью, вы можете использовать TimingFramework. Это немного сложнее, но позволяет делать классные анимации, позволяя рисовать определенный компонент с разной скоростью (вместо того, чтобы быть линейным)