You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android Kotlin保存最大速度函数问题:循环外变量值无法更新

问题分析与解决方案

首先咱们先揪出你代码里的核心问题:

  • 每次调用updateUI时,你都把getSpeedDouble初始化成了0.0,这就导致每次判断speed > getSpeedDouble都是和0比,而不是你之前存在SharedPreferences里的最大速度。
  • 你读取SharedPreferences的逻辑放在了if块内部,只有当当前速度大于0的时候才会去读之前的最大值,这完全搞反了顺序——应该先读已保存的最大值,再和当前速度比较。

修复后的基础代码

咱们调整逻辑顺序,先读取已有的最大速度,再做比较:

private fun updateUI(speed: Double, distance: Double){
    val df = DecimalFormat("0.0")
    // 更新当前速度和距离UI
    speed_text_view.text = df.format(speed).plus(" km/h")
    distance_text_view.text = df.format(distance)
    Log.e("getLocationUpdates", df.format(speed))

    // 先从SharedPreferences读取已保存的最大速度,默认值设为0.0
    val sharedPref = PreferenceManager.getDefaultSharedPreferences(this)
    val savedMaxSpeed = sharedPref.getString("SPEED", "0.0")?.toDouble() ?: 0.0

    // 比较当前速度是否大于已保存的最大值
    if (speed > savedMaxSpeed) {
        // 更新SharedPreferences里的最大值
        sharedPref.edit()
            .putString("SPEED", speed.toString())
            .apply()
        // 更新最大速度UI
        max_speed_text_view.text = df.format(speed)
        Log.e("MaxSpeedUpdated", "New max speed: ${df.format(speed)}")
    } else {
        // 如果当前速度没超过最大值,也要确保UI显示的是已保存的最大值(比如首次加载时)
        max_speed_text_view.text = df.format(savedMaxSpeed)
    }
}

更优的实现思路

频繁读写SharedPreferences属于磁盘IO操作,会有性能损耗,咱们可以用类级别的变量缓存当前的最大速度,减少SharedPreferences的读写次数:

// 类内部定义一个变量缓存最大速度,初始值从SharedPreferences读取
private var cachedMaxSpeed = 0.0

// 在Activity/Fragment的onCreate里初始化缓存
override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    // 初始化缓存的最大速度
    val sharedPref = PreferenceManager.getDefaultSharedPreferences(this)
    cachedMaxSpeed = sharedPref.getString("SPEED", "0.0")?.toDouble() ?: 0.0
    // 初始化最大速度UI
    val df = DecimalFormat("0.0")
    max_speed_text_view.text = df.format(cachedMaxSpeed)
}

private fun updateUI(speed: Double, distance: Double){
    val df = DecimalFormat("0.0")
    speed_text_view.text = df.format(speed).plus(" km/h")
    distance_text_view.text = df.format(distance)
    Log.e("getLocationUpdates", df.format(speed))

    if (speed > cachedMaxSpeed) {
        // 更新缓存
        cachedMaxSpeed = speed
        // 异步写入SharedPreferences(避免阻塞UI线程)
        PreferenceManager.getDefaultSharedPreferences(this).edit()
            .putString("SPEED", speed.toString())
            .apply()
        // 更新UI
        max_speed_text_view.text = df.format(speed)
        Log.e("MaxSpeedUpdated", "New max speed: ${df.format(speed)}")
    }
}

这个优化的好处:

  • 只有当最大速度更新时才会写入SharedPreferences,减少磁盘操作
  • 读取操作只在初始化时做一次,后续用缓存直接比较,效率更高
  • 避免了重复读取SharedPreferences的冗余代码

内容的提问来源于stack exchange,提问作者beginner992

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:00:12