Android取消定时器后重新启动定时器

15

我的应用程序中有一个计时器,每15秒启动一次AsyncTask。

Timer timer = new Timer();

public void AsynchTaskTimer() {
    final Handler handler = new Handler();

    TimerTask timertask = new TimerTask() {
        @Override
        public void run() {
            handler.post(new Runnable() {
                public void run() {
                    try {
                        new updateGPSTask().execute();
                    } catch (Exception e) {
                        // TODO Auto-generated catch block
                    }
                }
            });
        }
    };
    timer.schedule(timertask, 0, 15000); // execute in every 15sec
}

这个计时器是从onCreate()方法中启动的。

当我调用另一个活动时,我需要取消这个计时器。在我的主要活动中的onPause()方法中使用timer.cancel()实现了这一点。

现在,当我返回到主要活动时,我需要重新启动计时器。我尝试在onRestart()方法中重新启动AsynchTaskTimer(),但是我得到了一个java.lang.IllegalStateException: Timer was canceled错误。

如何重新启动计时器?


3
在onPause中将计时器设置为null,然后重新启动它,如:timer = new Timer();由于旧的计时器对象已被取消,因此无法重新启动,除非重新初始化为新的对象。 - Athul Harikumar
1
为什么要同时使用 Handler 和 Timer? - tony9099
3个回答

25

尝试使用:

public void AsynchTaskTimer() {
    final Handler handler = new Handler();

    TimerTask timertask = new TimerTask() {
        @Override
        public void run() {
            handler.post(new Runnable() {
                public void run() {
                    try {
                        new updateGPSTask().execute();
                    } catch (Exception e) {
                        // TODO Auto-generated catch block
                    }
                }
            });
        }
    };
    timer = new Timer(); //This is new
    timer.schedule(timertask, 0, 15000); // execute in every 15sec
    }

据我所知,通过使用这个方法你可以再次为计时器分配内存并启动它。


谢谢,这个可行,结合在“onPause()”方法中取消计时器! - pteixeira
我还没明白schedule()方法的第二个参数是什么意思。在这个例子中,timer.schedule(timertask, 0, 15000),0代表什么? - Antroid

17

那么关于 cancel() 方法,文档是怎么说的呢:

请注意,从重复计时器任务的 run 方法中调用此方法绝对保证定时器任务不会再次运行。

这意味着,如果你一旦 cancel() 定时器,就不能再次运行它。如果你想要再次运行它,需要创建一个新的定时器实例,例如在 onResume() 方法中。

@Override
public void onResume() {
   super.onResume();
   // intialise new instance of Timer
}

1

不要使用TimerTask,你可以将更新GPS的代码移动到服务中。我认为这样更好。你可以在onCreate()中调用startService(),并在onDestroy()中调用stopService()。请注意,服务运行在主UI线程上,因此确保避免在GPS更新任务中出现NetworkOnMainThreadException


这是我的初始方法,但由于某种原因,我的服务没有启动。由于这只是一个概念验证,所以并不重要,但如果它真的发展成为一个真正的东西,这是我要做的事情! - pteixeira

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接