在安卓系统中,无法在服务中启动计时器。

3

我不知道出了什么问题...我无法在我的服务中启动计时器。以下是代码:

public class BkgService extends Service{

private Timer ServUpdTimer = new Timer();
private static  long TMR_INTERVAL = 10*60*1000;

public void onCreate() {
    super.onCreate();
    StartServUpdateTask();
    }

private void StartServUpdateTask() {

        if(ServUpdTimer != null)
            ServUpdTimer.cancel();


        ServUpdTimer.scheduleAtFixedRate(new TimerTask() {
            @Override
            public void run() {
            }
        }, 0, TMR_INTERVAL);
    }
}

当我到达ServUpdTimer.scheduleAtFixedRate()这一行时,我遇到了以下异常:

03-03 23:32:14.851: E/AndroidRuntime(6083): java.lang.RuntimeException: Unable to start service mt.android.app.BkgService@40544838 with Intent { cmp=mt.android.app/.BkgService }: java.lang.IllegalStateException: Timer was canceled

如果有人能对此提供一些解释,我将非常感激...

如果您要重新使用计时器,必须创建一个新实例,而不是取消计时器。在“StartServUpdateTask”中的第一件事是终止计时器并使其无效。 - Jens
1个回答

14

Timer.cancel()的Javadoc说明如下:

一旦定时器被终止,其执行线程会优雅地终止,并且无法再安排更多任务。

Timer.scheduleAtFixedRate()的Javadoc说明如下:

如果任务已经被安排或取消,定时器已经取消,或者定时器线程已经终止,则抛出IllegalStateException异常。

Timer立即被取消:您需要创建一个新实例:

private void StartServUpdateTask() {

    if(ServUpdTimer != null)
    {
        ServUpdTimer.cancel();
    }
    ServUpdTimer = new Timer();

    ...
}

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