【问题标题】:Always getting same speed from GPS location - Kotlin始终从 GPS 位置获得相同的速度 - Kotlin
【发布时间】:2021-12-06 15:21:41
【问题描述】:

我试图在调用函数时在三秒内将用户的速度提高 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)。

我已经搜索过其他答案(例如this one),但我使用的似乎有所不同。为什么会这样?谢谢。

【问题讨论】:

    标签: java android xml kotlin


    【解决方案1】:

    至少有几个不同的原因,这不起作用。

    1. 您试图每秒轮询一次以上。我认为最快的位置更新速度最多是每秒一次,这将取决于设备。

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

    3. 在主线程上调用 Thread.sleep 将冻结您的应用。

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

    要在一段时间内获取多个位置,您需要使用requestLocationUpdates 而不是lastLocationSee here for the documentation.

    编辑,根据您的评论扩展 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 实例。

    【讨论】:

    • 谢谢。原因 2 一定是导致总值为 10x it.speed 的原因。但我不明白为什么它也总是相同的数量(3.4)?
    • 我添加了一个例子来帮助你理解。
    • 感谢您的解释,在最后的评论中我可能没有很好地解释自己。我想问为什么它总是 3.4m/s,不仅在循环的 10 次中将相同的值添加到 sumSpeed,而且每次执行整个代码块时(即无论用户以何种速度运行,在用户打开应用程序的任何位置)。
    • 我不希望lastLocation 提供准确的速度,因为它是被动的。如果没有应用程序主动频繁地轮询位置,则最后一个位置可能只包含一个非常过时的速度值。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-22
    • 1970-01-01
    • 2020-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多