2

我对用于 Android (Java) 的这段代码有疑问

handler.postDelayed(new Runnable(){
public void run(){
    // Your code goes here...
}
}, 500);

如果延迟大约为 500 毫秒,那么程序似乎会在 0.5 秒时重复该任务,但如果我更改为小于 100 毫秒甚至更短,它就不再跟随了。我测试了亮度变化,有一段时间它可以以该速率重复亮度变化,但随后减慢并再次恢复正常闪光速率。似乎不稳定。无论手机 CPU 的负载如何,您是否有任何代码可以提供精确的延迟。

非常感谢

4

2 回答 2

5

不是来自 Java,不;股票 Java 不是实时系统。

计时精度取决于 JVM操作系统的调度程序。您可能能够逐步提高精度,但无法保证您正在寻找的精度。

于 2012-09-04T22:39:56.687 回答
0

如果您使用具有周期性滴答声的 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();
于 2012-09-04T23:04:58.283 回答