以一定的时间间隔运行方法

时间:2013-01-11 15:15:56

标签: java android timer

Java / Android是否有任何构造可用于在某个时间间隔内在类中运行方法?

我知道SchedulerTimer类,但我需要避免实例化另一个类。该方法不能在另一个单独的线程中运行。运行AsyncTaskHandler会产生一个单独的帖子。

4 个答案:

答案 0 :(得分:1)

  

该方法不能在另一个单独的线程中运行

由于这个要求你只有一个合理的解决方案,你必须在你自己的线程中等待,如下所示:

for (int i = 0; i < 100; i++) {
    long intervalInMs = 1000; // run every second
    long nextRun = System.currentTimeMillis() + intervalInMs;
    callAMethod();
    if (nextRun > System.currentTimeMillis()) {
        Thread.sleep(nextRun - System.currentTimeMillis());
    }
}

注意,如果方法调用花费的时间比您想要等待的时间长,它将不会调用两次(因为您只有一个Thread)您可以通过编写else子句来检测它if,并进行一些修改(例如增加intervalInMs);

答案 1 :(得分:0)

您需要使用AlarmManager。

检查此SO以获得良好的概述:Android: How to use AlarmManager

我不会尝试在你自己的线程中管理它,但让Android框架为你处理这个问题。不确定为什么需要它在同一个线程中运行。

答案 2 :(得分:0)

创建一个接收监听器的自定义Timer,然后当你的时间结束时,将回调发送到在他的线程中创建了Timer的对象。

这将为Timer创建一个新的Thread,但是你想要执行的方法将在原始的对象线程上执行

答案 3 :(得分:0)

如果你真的必须在没有阻塞的同一个线程中执行此操作,一种可能的解决方案是进行某种轮询。我想象代码会定期计算自上次触发方法以来经过的时间。如果已配置的时间段已过,则再次激活该方法。

这种解决方案实施起来似乎很复杂。您多久执行一次轮询代码?如何在应用程序的其余部分的逻辑中执行可能在同一时间内继续执行的轮询代码?这些只是我们想到的技术挑战。我确定还有其他人。考虑到这一点,我认为更好的解决方案是重新考虑您的限制。为什么要在同一个线程中执行此操作?您应该仔细考虑自己的原因,并考虑使用单独的线程(无论您是使用Timer自行滚动还是使用Android平台通过AlarmManager为您管理它。