-1

我正在写我的学士论文,但遇到了一个问题。

我有的:

我编写了一个应用程序,该应用程序应该测量来自外部设备的传感器数据。因此,它应该运行很长时间。

在我MainActivity的用户按下一个按钮来启动一个Service. 在Service它内部创建多个Timers 和TimerTasks (每个传感器一个)。我将它们存储在两个单独List的 s 中。每个传感器都有自己的时间段,说明它应该多久被调用一次。例如,sensor1 每 10 秒调用一次,sensor2 每 5 分钟调用一次。为了实现这一点,我打电话

timer.scheduleAtFixedRate(currentTask, 0, period);

每次开始TimerTaskService

在该run()方法中,我调用传感器并将其值和时间戳保存在应用程序的数据库中。

问题是什么:

只要设备处于开启状态,一切正常。但是一旦设备进入睡眠状态,它就真的开始变得奇怪了。

例如:我有一个传感器计划每 10 秒获取一次值。我按下开始并让设备保持开启状态 30 秒。这样我每 10 秒得到 3 个值。然后我按电源使其进入睡眠模式1分钟,然后再次打开。我得到的是 6 个值(如预期的那样),但时间戳不合适。在设备打开的最后一个时间戳和第一个进入睡眠状态之间的时间超过 10 秒。接下来的几个甚至具有相同的时间戳,这意味着该run()方法在同一秒内被多次调用。当我打开设备时,每次都会恢复正常并且工作正常。

这意味着在睡眠模式下某些东西无法正常工作。我想它一定TimerTask和 有关系Timer

更多重要信息:

可以排除什么(我猜):

  • 我调用系统时间的方式(我什至试过SystemClock.elapsedRealtime(),同样的问题)
  • 该设备(我在我的 Nexus 7(2013)和 S3 Mini 上对其进行了测试,都失败了,它在我的 Nexus 4 上工作,这意味着这个设备似乎没有正确进入睡眠状态,但我猜这是另一个问题)
  • 外部传感器(因为我使用模拟而不是意味着我创建随机值而不是调用真实传感器只是为了测试)
4

1 回答 1

0

我想它一定与TimerTask和Timer有关。

更重要的是,当 CPU 断电时,您的代码不会运行。

如果您的设备将始终插入电源并且您将始终在前台android:keepScreenOn="true"显示 UI,请在该 UI 中添加一些小部件,以保持屏幕和 CPU 处于开机状态。

或者,如果您的设备将始终插入电源,请购买自己的设备WakeLock以保持 CPU 通电。这将需要WAKE_LOCK许可。这不是生产应用程序的合适解决方案,但对于一些实验室实验(即,您不会在 Play Store 上发布的东西),它应该没问题。

或者,如果您的设备无法插入电源,请将您的TimerTimerTask、 和Service替换为AlarmManager和 :

这些会将设备从睡眠模式中唤醒并让您做一些工作,然后再让设备再次进入睡眠状态。

但是,如果您真的打算连接到某些外部硬件,请记住这种方法可能效果不佳,因为当设备从睡眠模式唤醒时再次握手以将设备连接到外部硬件可能需要很长时间。在这种情况下,您确实需要确保设备始终有电,以便您可以采用这种WakeLock方法。

于 2013-10-12T12:37:41.183 回答