Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/225.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 后台服务中的计时_Java_Android_Android Service - Fatal编程技术网

Java 后台服务中的计时

Java 后台服务中的计时,java,android,android-service,Java,Android,Android Service,我制作了一个跑步应用程序,为此,我制作了一个服务类来更新用户位置(删除了不重要的代码): 在每次位置更新之后,我还要计算经过的时间(我必须通过添加来计算,因为用户可能会暂停活动)。问题是,当我在办公室运行应用程序时,时间是精确的(例如35分钟),但当我骑自行车时,时间太短(实际大约30分钟过去时显示15分钟)。就时间而言,唯一的区别在于它的调用频率更高(办公室内的gps仅每10-20秒刷新一次,而外部可能甚至每2秒刷新一次)。路线和距离都很好-服务没有被破坏或类似的事情。我也在更新活动中的时间,

我制作了一个跑步应用程序,为此,我制作了一个服务类来更新用户位置(删除了不重要的代码):

在每次位置更新之后,我还要计算经过的时间(我必须通过添加来计算,因为用户可能会暂停活动)。问题是,当我在办公室运行应用程序时,时间是精确的(例如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);