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
相关产品推荐
相关产品推荐

