uptimeMillis()会多久重置一次?它会影响Handler.postAtTime吗?

3
方法 uptimeMillis 的描述如下:

返回自启动以来经过的毫秒数,不包括深度睡眠时间。 注意:此值可能会偶尔重置(在它本应该环绕时)。

这种情况会发生多久,更重要的是,它会影响应该由 Handler.postAtTime 执行的可运行项吗?
3个回答

2
如果在uptimeMillis包装时恰好调用了它,那么是的,它会影响你的postAtTime调用。
Java中的有符号长整型的范围为:
-9,223,372,036,854,775,807 to 9,223,372,036,854,775,807 (~9.2E18)

9.2E18 毫秒是 292,277,266 年。如果你正在开发太空探测器,你可能需要考虑到这一点;否则,你可以假设它在你有生之年内不会出现溢出的情况。
对我来说,最让人困惑的是 Android 文档中关于 uptimeMillis 的说明声称:

此时钟保证是单调的...

然而不久后他们又说,由于变量溢出, uptimeMillis 将被重置 - 这与单调时钟的定义完全相反!

1
你假设本地方法的底层表示也是64位的,这可能是真的,也可能不是。 - matt5784

2

uptimeMillis调用会转换成systemTime(),在Linux系统上会变成clock_gettime(CLOCK_MONOTONIC, struct timespec *)。

struct timespec中的秒数以time_t形式表示,这似乎是一个32位的值。如果它从零开始计数,当它回绕时,你很可能已经不在了。

如果你需要更具体的细节,你应该研究Linux内核中clock_gettime(CLOCK_MONOTONIC)的行为。


0

我曾经在一个服务中使用它,从未见过它重置。我真的认为它不会重置。 postAtTime() 的问题是,在睡眠期间它不会被调用(因为 uptimeMillis() 不会更新)。如果这是个问题,那么我会使用其他方法。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接