3

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

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

4

4 回答 4

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);

于 2013-01-11T16:07:20.610 回答
0

为此,您需要使用 AlarmManager。

检查此 SO 以获得良好的概述:Android:如何使用 AlarmManager

我不会尝试在您自己的线程中进行管理,而是让 Android 框架为您处理。不知道为什么你需要它在同一个线程中运行。

于 2013-01-11T19:42:45.710 回答
0

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

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

于 2013-01-11T19:48:26.037 回答
0

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

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

于 2013-01-11T19:46:18.617 回答