当调用函数时,我试图在三秒钟内获得用户的速度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)
我已经搜索了其他的答案(像这个),但我使用的似乎是不同的。为什么会发生这种情况?谢谢你。
这至少有几个不同的原因。
-
您正在尝试每秒轮询不止一次。我认为位置更新的最快速度最多是每秒一次,这取决于设备。
-
您只是将相同的值添加到总和10次并无意义地休眠线程。调用
sleep
会暂停代码的执行。它不会神奇地将it
的值更改为从GPS轮询的某个新值。 -
在主线程上调用
Thread.sleep
会冻结你的应用程序。 -
您正在轮询
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
实例。