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()方法启动的。

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

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

如何重新启动计时器?

4

3 回答 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
    }

通过使用它,您可以再次将内存分配给 Timer 并启动它 AFAIK。

于 2013-03-28T11:34:08.953 回答
17

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

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

这意味着如果您一旦取消()计时器,您将无法再次运行它。您需要创建 Timer 的新实例,例如在onResume()方法中如果您想再次运行它。

@Override
public void onResume() {
   super.onResume();
   // intialise new instance of Timer
}
于 2013-03-28T11:34:16.077 回答
1

TimerTask您可以将代码(用于更新 GPS)移动到服务,而不是使用。我认为这更好。你可以打电话startService()进来。请注意,服务在主 UI 线程上运行,因此请确保避免在您的 GPS 更新程序任务中使用。onCreate()stopService()onDestroy()NetworkOnMainThreadException

于 2013-03-28T11:43:23.663 回答