总是从GPS位置获得相同的速度- Kotlin



当调用函数时,我试图在三秒钟内获得用户的速度10倍,然后计算所有获得值的总和。我有一个全局变量:

lateinit var fusedLocationProviderClient : FusedLocationProviderClient

然后在onCreate方法中像这样初始化:

fusedLocationProviderClient = LocationServices.getFusedLocationProviderClient(this)

下面是我计算速度总和的代码:

val task = fusedLocationProviderClient.lastLocation
var sumSpeed = 0F
task.addOnSuccessListener {
if (it != null) {
for (i in 1..10) {
Thread.sleep(300)
sumSpeed += it.speed
}
}
current_gps_speed_tv.text = "Total is: $sumSpeed"
if (sumSpeed < 25) {
...
}
}

sumSpeed的结果始终保持不变(34m/s),是it.speed的10倍,每次也相同(3.4m/s)

我已经搜索了其他的答案(像这个),但我使用的似乎是不同的。为什么会发生这种情况?谢谢你。

这至少有几个不同的原因。

  1. 您正在尝试每秒轮询不止一次。我认为位置更新的最快速度最多是每秒一次,这取决于设备。

  2. 您只是将相同的值添加到总和10次并无意义地休眠线程。调用sleep会暂停代码的执行。它不会神奇地将it的值更改为从GPS轮询的某个新值。

  3. 在主线程上调用Thread.sleep会冻结你的应用程序。

  4. 您正在轮询lastLocation,这是上次使用GPS时已经知道的某个位置。它只报告来自过去的单个值。它不能报告多个新值。您的成功侦听器只被调用一次,因为最后一个位置可用或不可用。

要在一段时间内获得多个位置,您需要使用requestLocationUpdates而不是lastLocation。查看这里的文档。

编辑,根据您的评论扩展2:

想象下面的代码:

val x = 5
var sum = 0
for (i in 0..9) {
sum = sum + 5
}
println(sum)

这将x的值与sum相加10次,因此结果将是50。

现在考虑下面的代码:
val x = 5
var sum = 0
for (i in 0..9) {
Thread.sleep(100)
sum = sum + 5
}
println(sum)

这段代码有完全相同的结果。它只是需要更长的时间才能返回,因为它会一直停下来睡觉。休眠对x的值没有影响。x总是相同的值。代码中的it也是如此。在你的函数中只有一个it实例。