gpt4 book ai didi

android - 用 nanoTime() 循环

转载 作者:行者123 更新时间:2023-12-03 00:47:12 29 4
gpt4 key购买 nike

我想做与下面这段代码相同的操作,但使用 System.nanoTime()反而

new Timer().schedule(new TimerTask()
{
public void run()
{
bt.send("Start");

try {
Thread.currentThread().setPriority(1);
Thread.sleep(50, 0);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}


s.playSound();
} }
, 0, 3000);

这个想法是运行这两种方法 send()playSound() 一个接一个 (运行 send() 后 50 毫秒),在 中定期间隔 3 秒。
我要使用 nanoTime()的原因是计时器不准确,从android设备播放音频也有一些延迟,我在寻求准确性和及时性。我也尝试在单独的线程中执行此操作,但仍然有很多延迟。
所以我尝试将代码更改为这样的:
    long t1=System.nanoTime();
long t = t1;
while(true)
{
long t2 = System.nanoTime();
if(t2>=t1+3 seconds)
bt.send("Start");
t1=t2;
t3=System.nanoTime();
if(t3>=t+3500 milliseconds)
playsound();
t=System.nanoTime();
}

当然,它不起作用。谁能帮我?

最佳答案

我不知道你从哪里得到使用的想法 while(true)但这永远不会奏效。通常,这整个代码块永远不会工作。

您的原始代码有正确的想法,使用 Timer .但您也可以使用 Handler如果你想。但我必须告诉你:精确地计时几乎是不可能的,你必须小心 nanoTime() .普通智能手机上没有任何系统可以测量几纳秒的时间跨度。即使是毫秒也可能不准确。

无论如何 1 纳秒 = 0.000000001 秒。我 高度 怀疑您是否需要如此精确的时间。只需使用 nanoTime()不会增加测量的任何准确性,只会增加不准确性的可能性。

我的观点是:原始代码几乎是正确的,我严重怀疑 Timer那是不准确的。很可能您只是认为它不准确,因为其他一些不相关的编程错误。

我稍微修改了您的代码以测试其准确性,这是我使用的代码:

new Timer().schedule(new TimerTask() {
public void run() {
long start = System.currentTimeMillis();
try {
Thread.sleep(50, 0);
} catch (InterruptedException e) {
e.printStackTrace();
}

long end = System.currentTimeMillis();

final long pause = end - start;
final long interval = start - lastStartup;
lastStartup = start;
Log.i("Timing Tests", interval + " / " + pause);
}
}, 3000, 3000);

这些是我得到的结果:
Timing Tests﹕ 3000 / 50
Timing Tests﹕ 3000 / 51
Timing Tests﹕ 3000 / 50
Timing Tests﹕ 3000 / 50
Timing Tests﹕ 3000 / 50
Timing Tests﹕ 3000 / 50
Timing Tests﹕ 3000 / 51
Timing Tests﹕ 3000 / 50
Timing Tests﹕ 3000 / 50
Timing Tests﹕ 3000 / 50
Timing Tests﹕ 3000 / 50
Timing Tests﹕ 3001 / 50
Timing Tests﹕ 3000 / 50
Timing Tests﹕ 3001 / 50
Timing Tests﹕ 3000 / 50
Timing Tests﹕ 3000 / 51
Timing Tests﹕ 3000 / 50
Timing Tests﹕ 3000 / 50
Timing Tests﹕ 3000 / 50
Timing Tests﹕ 3001 / 50
Timing Tests﹕ 3000 / 50
Timing Tests﹕ 3000 / 50
Timing Tests﹕ 3001 / 50
Timing Tests﹕ 3000 / 50
Timing Tests﹕ 3000 / 50

换句话说, Timer精确到 +-1ms。这将尽可能准确,不仅在 Android 上,而且在任何操作系统上。这是如此准确,以至于没有用户能注意到这个微小的差异。

所以我想我要说的是:您的代码已经尽可能准确。如果您有时间问题,则与 Timer 无关。或 TimerTask .

关于android - 用 nanoTime() 循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25183807/

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