如果您使用具有周期性滴答声的 CountDownTimer,您可能可以做一些更精确的事情。本质上,您将其设置为倒计时一段时间,如果需要,可以是几小时,并且有两种方法,一种方法在每次滴答时调用,另一种方法在计时器结束时开始另一个方法。无论如何,您可以将滴答声设置为非常快,然后通过检查点击中的实际时间差仅在延迟点启动代码。我认为这是你能做的最好的事情。基本上在滴答声内,如果实际经过了正确的时间,您将发出信号。该信号将启动线程或释放已经运行的线程正在等待的东西。CountDownTimer 的值是多少,我想它只是您可以进行非常频繁的轮询和经过时间检查。虽然不能保证,但您可以将滴答之间的时间设置为高频率并非常频繁地检查/轮询。这可以带来流畅的性能,与实时系统不同。它更可能是准确的,因为它只是发出信号,而不是仅仅为了发出信号而占用线程资源。您也可以尝试使用 IntentService 来执行任务,并在每次调用时调用 startService(intentToIntentService)。看看线程是否在像 IntentService 这样的服务中工作得更好,我相信它确实将它们排队。它更可能是准确的,因为它只是发出信号,而不是仅仅为了发出信号而占用线程资源。您也可以尝试使用 IntentService 来执行任务,并在每次调用时调用 startService(intentToIntentService)。看看线程是否在像 IntentService 这样的服务中工作得更好,我相信它确实将它们排队。它更可能是准确的,因为它只是发出信号,而不是仅仅为了发出信号而占用线程资源。您也可以尝试使用 IntentService 来执行任务,并在每次调用时调用 startService(intentToIntentService)。看看线程是否在像 IntentService 这样的服务中工作得更好,我相信它确实将它们排队。
Date startDate = new Date();
long startTime = startDate.getTime();
// Tick called every 10th of a second. OnFinish called at Signal.
CountDownTimer ctDownTimer = new CountDownTimer(30000, 100) {
long startIntervalTime=startTime;
public void onTick(long millisUntilFinished) {
Date now = new Date();
long nowTime = now.getTime();
if ((startIntervalTime - nowTime) > 100)
{
issueSignal();
intervalStartTime=nowTime;
}
now=null;
}
public void onFinish() {
Log.d("MyClass", "Done") // Maybe start out.
}
}.start();