gpt4 book ai didi

android - 如何减少 Android 中的 Thread.sleep() 延迟

转载 作者:太空宇宙 更新时间:2023-11-03 10:30:04 24 4
gpt4 key购买 nike

我在 Android 应用程序的(非 UI)线程的循环中生成计时事件,我需要这些事件以精确的时间间隔发生,(这里精确意味着不超过 +/- 5毫秒)。用户可以察觉到任何 +/-10 毫秒(当然还有 +/-20 毫秒)的错误。在此循环的顶部,我进行了一些其他计算,这些计算需要花费可变的时间量,但在循环的底部,我需要事件在预先计算的时间发生。

下面是对我的非 UI 线程的一次尝试的高度简化版本(没有异常处理):

public final void run() {

long loopTime = 2500L;
long eventTime = (System.nanoTime() / 100000L) + loopTime;

while (true) {

calcutionsTakingVaryingAmountOfTime(); // takes 200 millisecs or less

long eventWait = eventTime - (System.nanoTime() / 100000L);
Thread.sleep(eventWait / 10L);
listener.onEvent();

eventTime = eventTime + loopTime;
}
}

需要精确计时的是对listener.onEvent()的调用。

在上面的示例中,计时变量 loopTimeeventTimeeventWait 以十分之一毫秒为单位测量时间。表达式 (System.nanoTime()/100000L) 测量当前时间同样以十分之一毫秒为单位。

我绝对确定 calcutionsTakingVaryingAmountOfTime() 总是 花费不到 200 毫秒,而对 listener.onEvent() 的调用只是几毫秒。就目前而言,将 loopTime 设置为 2500L,我的事件应该每 250 毫秒发生一次。

我已经使用我的代码(未显示)将 Log.d() 中的延迟打印到 Thread.sleep() 唤醒时间。也就是我计算

long latency = (System.nanoTime() / 100000L) - eventTime

Thread.sleep() 返回后立即打印到 Log.d()

当我在模拟器中运行它时,我发现 latency(在除以 10 以将结果转换为毫秒之后)通常在连续通过循环的过程中在 1 到 50 毫秒之间跳跃, 偶尔值高达半秒。在实际设备上运行时,情况好多了,但仍然有点不稳定(即使如此,模拟器的行为让我怀疑这是否会在用户设备上发生)。

为了稳定我的事件并控制延迟,我尝试了其他几种方法:

  • Thread.sleep(eventWait/10L) 调用替换为对 this.wait(eventWait/10L) 的调用(完全不恰当的使用等待(),我知道)

  • 我在进入循环之前操纵线程优先级,调用 Process.setThreadPriority(Process.THREAD_PRIORITY_URGENT_AUDIO) 就像在整个 android 库中所做的那样

但是这些延迟没有任何改善。

稳定事件并将延迟减少到小于 2 或 3 毫秒并且很少出现问题的一种方法是替换 Thread.sleep() 调用通过轮询循环:

while ((System.nanoTime() / 100000L) < eventTime)
;

一方面,我觉得像醉酒的水手一样花机器周期换取自由感到尴尬。另一方面,我开始认为没有更好的方法,我应该在轮询循环中消耗机器周期以减少延迟,并满足我的规范。当然,当我的应用程序进入后台时,我会暂停我的线程,这样这个轮询循环就可以工作了。但是太浪费了。

任何想法将不胜感激。

最佳答案

出于类似目的,我将延迟消息与 Handler 一起使用。这可能有点矫枉过正。在你的情况下,我会看看 Timer 类。

mTimer = new Timer();
mTimer.scheduleAtFixedRate(new TimerTask() {
@Override
public void run() {
Log.v("TEST", " tick");
}
}, 0, 250);

这让我在模拟器上有 +-2 毫秒的延迟。

关于android - 如何减少 Android 中的 Thread.sleep() 延迟,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7340302/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com