Java 后台服务中的计时
我制作了一个跑步应用程序,为此,我制作了一个服务类来更新用户位置(删除了不重要的代码): 在每次位置更新之后,我还要计算经过的时间(我必须通过添加来计算,因为用户可能会暂停活动)。问题是,当我在办公室运行应用程序时,时间是精确的(例如35分钟),但当我骑自行车时,时间太短(实际大约30分钟过去时显示15分钟)。就时间而言,唯一的区别在于它的调用频率更高(办公室内的gps仅每10-20秒刷新一次,而外部可能甚至每2秒刷新一次)。路线和距离都很好-服务没有被破坏或类似的事情。我也在更新活动中的时间,但每次更新时都用广播时间(按服务时间)替换它,但即使删除它也不能解决问题。为什么会发生这种情况?如中所述Java 后台服务中的计时,java,android,android-service,Java,Android,Android Service,我制作了一个跑步应用程序,为此,我制作了一个服务类来更新用户位置(删除了不重要的代码): 在每次位置更新之后,我还要计算经过的时间(我必须通过添加来计算,因为用户可能会暂停活动)。问题是,当我在办公室运行应用程序时,时间是精确的(例如35分钟),但当我骑自行车时,时间太短(实际大约30分钟过去时显示15分钟)。就时间而言,唯一的区别在于它的调用频率更高(办公室内的gps仅每10-20秒刷新一次,而外部可能甚至每2秒刷新一次)。路线和距离都很好-服务没有被破坏或类似的事情。我也在更新活动中的时间,
uptimeMillis()
自系统启动以来以毫秒计。
当系统进入深度睡眠时,该时钟停止(CPU关闭,显示
暗,设备等待外部输入)
因此,这可能是你得到不同时间的原因。另一方面,有elapsedRealtime()
和elapsedrealtimenos()
方法
返回自系统启动以来的时间,并包括深度睡眠。
这个时钟保证是单调的,并且继续滴答作响
当CPU处于节能模式时,推荐的节能依据也是如此
通用间隔定时
尝试使用其中一种方法。我建议使用onLocationChanged()中每次位置更新的时间,并将其传递给您的sendUpdates()方法
void onLocationChanged(Location location){
long currentTime=location.getTime(); // unix time in milliseconds
.......
sendUpdates(currentTime);
}
然后在发送更新(长currentTime)中进行时间计算。如果我理解正确,您只对应用程序启动后经过的时间感兴趣。在这种情况下,我想您可以简化数据对象,只需使用data.startTime、data.seconds、data.minutes和data.hours作为经过的时间。您可以从应用程序启动后的第一个修复位置获取启动时间(使用标志或类似标志检测第一个修复)
然后在sendUpdates(long currentTime)中,我将计算所用时间的秒、分钟、小时,如下所示:
int elapsedSeconds=int((currentTime-data.StartTime)/1000);
data.hours=int(elapsedSeconds/3600);
data.minutes=int(elapsedSeconds/60)-60*data.hours;
data.seconds=elapsedSeconds-60*(data.minutes+60*data.hours);
就这样!使用elapsedRealtime()修复了该问题。我从没想过updateMillis()会以这种方式工作。谢谢,这是一个很酷的解决方案,但是@Kirill Simonov的解决方案比这个稍微简单一些。
int elapsedSeconds=int((currentTime-data.StartTime)/1000);
data.hours=int(elapsedSeconds/3600);
data.minutes=int(elapsedSeconds/60)-60*data.hours;
data.seconds=elapsedSeconds-60*(data.minutes+60*data.hours);