开发者

Is there any possibility to pause&resume a TimerTask in Android?

开发者 https://www.devze.com 2023-01-09 21:00 出处:网络
I\'m calling this tasks: TimerTask taskA = new ThreadA(this); TimerTask taskB = new ThreadB(this开发者_如何学编程);

I'm calling this tasks:

TimerTask taskA = new ThreadA(this);
TimerTask taskB = new ThreadB(this开发者_如何学编程);

tasks.add(taskA);
tasks.add(taskB);

timer.schedule(taskA, 10000);
timer.schedule(taskB, 5000);

And here are the two TimerTasks:

public class ThreadA extends TimerTask {

    private Ghost ghost;

    public GhostThread(Ghost ghost) {
        this.ghost = ghost;
    }

    @Override
    public void run() {
        ghost.stopBeingDeadAndBeAwesomeAgain();
    }
}

public class ThreadB extends TimerTask {

    private Ghost ghost;

    public WarnThread(Ghost ghost) {
        this.ghost = ghost;
    }

    @Override
    public void run() {
       ghost.beDeadAgain();
    }

}

As you can see, I just call a method after 5 resp. 10 seconds. From time to time I would like to pause the "countdown". This means i want that the time until the 5 seconds are passed isn't running anymore. And then in a later point in time, I would like to resume it.

How can I achieve that??


The simplest solution would be to simply make a copy of the TimerTask, cancel it to pause, purge if you want, and then reschedule it to resume.

// pause
long timeLeft = 5000 - (new Date().getTime() - taskB.scheduledExecutionTime());
ThreadB taskBpaused = taskB.clone();
taskB.cancel();
timer.purge();
taskB = taskBpaused;

// resume
timer.schedule(taskB, timeLeft, ...);

Important note: if the task hasn't run yet, then this won't work. Google's documentation states that if it hasn't run, scheduledExecutionTime() will return an undefined value, and I don't have the capability to test what exactly that means at the moment. Needless to say, if you aren't sure it's already run, you'll need some kind of conditional to make sure the value isn't undefined.

0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号