取消后,Android重新启动计时器

时间:2013-03-28 11:30:47

标签: android timer android-asynctask

我的应用程序中有一个计时器,每隔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()方法中重新启动onRestart(),但我得到java.lang.IllegalStateException: Timer was canceled

如何重新启动计时器?

3 个答案:

答案 0 :(得分:19)

尝试使用:

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。

答案 1 :(得分:13)

所以关于 cancel()方法的文档:

  

请注意,从a的run方法中调用此方法   重复计时器任务绝对保证计时器任务将   不要再跑了。

这意味着如果您曾经取消()计时器,则无法再次运行它。您需要创建Timer的新实例,例如,如果您想再次运行它,请使用onResume()方法。

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

答案 2 :(得分:1)

您可以将代码(用于更新GPS)移至service,而不是使用TimerTask。我觉得它更好。您可以拨打onCreate()中的startService()onDestroy()中的stopService()。请注意,服务在主UI线程上运行,因此请确保在GPS更新程序任务中避免使用NetworkOnMainThreadException