我正在写我的学士论文,但遇到了一个问题。
我有的:
我编写了一个应用程序,该应用程序应该测量来自外部设备的传感器数据。因此,它应该运行很长时间。
在我MainActivity
的用户按下一个按钮来启动一个Service
. 在Service
它内部创建多个Timer
s 和TimerTask
s (每个传感器一个)。我将它们存储在两个单独List
的 s 中。每个传感器都有自己的时间段,说明它应该多久被调用一次。例如,sensor1 每 10 秒调用一次,sensor2 每 5 分钟调用一次。为了实现这一点,我打电话
timer.scheduleAtFixedRate(currentTask, 0, period);
每次开始TimerTask
时Service
。
在该run()
方法中,我调用传感器并将其值和时间戳保存在应用程序的数据库中。
问题是什么:
只要设备处于开启状态,一切正常。但是一旦设备进入睡眠状态,它就真的开始变得奇怪了。
例如:我有一个传感器计划每 10 秒获取一次值。我按下开始并让设备保持开启状态 30 秒。这样我每 10 秒得到 3 个值。然后我按电源使其进入睡眠模式1分钟,然后再次打开。我得到的是 6 个值(如预期的那样),但时间戳不合适。在设备打开的最后一个时间戳和第一个进入睡眠状态之间的时间超过 10 秒。接下来的几个甚至具有相同的时间戳,这意味着该run()
方法在同一秒内被多次调用。当我打开设备时,每次都会恢复正常并且工作正常。
这意味着在睡眠模式下某些东西无法正常工作。我想它一定与TimerTask
和 有关系Timer
。
更多重要信息:
可以排除什么(我猜):
- 我调用系统时间的方式(我什至试过
SystemClock.elapsedRealtime()
,同样的问题) - 该设备(我在我的 Nexus 7(2013)和 S3 Mini 上对其进行了测试,都失败了,但它在我的 Nexus 4 上工作,这意味着这个设备似乎没有正确进入睡眠状态,但我猜这是另一个问题)
- 外部传感器(因为我使用模拟而不是意味着我创建随机值而不是调用真实传感器只是为了测试)