我正在开发一个运行实时线程的应用程序。
我的电脑很慢,模拟器在上面运行很慢。当我测试我的应用程序时,似乎 SystemClock.uptimeMillis()
调用从实际计算机时钟返回实时值,这意味着即使模拟器是。
这个预感是否正确?模拟器时钟与真实计算机系统时钟相关联(而不是自身被模拟并根据主机的 CPU 负载受到波动)?似乎是一个显而易见的问题,但我无法在互联网上找到它。
如果是这样的话,那就有意义了。我需要确定地知道,因为我需要知道我的线程无法跟上是否仅仅是模拟器缓慢的症状,或者我是否真的需要重新设计一些东西。 (无法在真手机上测试,因为我还没有)。
最佳答案
我相信我的直觉是正确的。
我运行了一些简单的测试,例如:
long start = SystemClock.uptimeMillis();
Log.d("blah", "start");
while (SystemClock.uptimeMillis() < start + 10000)
{
// do some work-intensive stuff here
}
Log.d("blah", "finish");
...无论我在中间的 10 秒内做了什么(在代码循环内和/或故意使用我的计算机做其他事情来加载 CPU),线程总是在它启动后 10 秒后准确报告(+ 10 毫秒,我假设的开销),根据 LogCat 时间戳和秒表判断,这对我来说表明加载的主机 CPU 根本不会像预期的那样扩大模拟器中的时间感。
要改变这种行为,我想我想传递一个选项给 QEMU 层:
$ emulator -avd my_avd -qemu -clock vm
但这实际上可能只与启动 VM 时设置时间有关(QEMU 显然确实独立于管理 currentTimeMillis()、uptimeMillis() 和 nanoTime() 的结果)。不确定(QEMU 的文档非常粗糙。)无论如何,Android QEMU 似乎缺少“vm”时钟,因此以上内容不起作用。注意:
$ emulator -avd my_avd -qemu -clock ?
Available alarm timers, in order of precedence:
unix
但至少我已经收集到足够的证据来怀疑我的小理论是正确的。 :-) 我看不到模拟应用程序如何在没有链接到真实时钟的情况下播放音频或执行 UI 过渡效果等,所以这是有道理的。但是如果可以选择模拟时钟就更好了。
关于android - 模拟器时钟是否与真实系统时钟同步?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5774612/