【问题标题】:Android relaunching Timers after they are canceledAndroid在取消后重新启动计时器
【发布时间】:2013-03-28 11:30:46
【问题描述】:

我的应用程序中有一个计时器,它每 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() 方法启动的。

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

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

如何重新启动计时器?

【问题讨论】:

  • 在 onpause 中将计时器设置为 null 并像 timer = new Timer();并在旧的散列对象被取消时启动它,除非重新启动到新对象,否则它不能重新启动
  • 为什么要同时使用处理程序和计时器?

标签: android timer android-asynctask


【解决方案1】:

尝试使用:

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。

【讨论】:

  • 谢谢你,这行得通,结合在onPause()方法中取消计时器!
  • 唯一我无法得到的是 schedule() 方法的第二个参数是做什么的? timer.schedule(timertask, 0, 15000),在这个例子中0代表什么
【解决方案2】:

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

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

这意味着如果你曾经 cancel() Timer 你不能再次运行它。如果您想再次运行它,您需要创建一个新的 Timer 实例,例如在 onResume() 方法中。

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

    • 这是我最初的方法,但由于某种原因,我的服务没有启动。因为这只是为了证明概念,它并不重要,但如果它在我的 TODO 列表中它永远发展成一个真实的东西!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-02
    • 1970-01-01
    • 1970-01-01
    • 2020-06-05
    相关资源
    最近更新 更多