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

如何在Kotlin中从Runnable保存计时器数值至SharedPreferences

问题解决:获取并保存计时器的最终数值

问题根源是你在Runnable里定义的record是局部变量,作用域仅局限在run()方法内部,所以外部的stop()函数无法访问它。不过你已经声明了全局的number变量,每次计时器递增都会实时更新这个变量,直接用它就能拿到最终计时数值,完全没必要在Runnable里额外定义record。

修改后的完整代码

lateinit var sharedPreferences : SharedPreferences
var number = 0
var runnable : Runnable = Runnable{ }
var handler : Handler = Handler(Looper.getMainLooper())

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)
    sharedPreferences = this.getSharedPreferences("com.mycompany.runnables", MODE_PRIVATE)
    val recordFromSP = sharedPreferences.getInt("record",-1)
    textView2.text = "Last Time Record: $recordFromSP"
}


fun start(view:View){
    number = 0
    runnable = object : Runnable{
        override fun run() {
            number = number+1
            textView.text = "Time: $number"
            button3.setEnabled(false)
            button4.setEnabled(true)
            handler.postDelayed(this,1000)
            // 移除多余的局部变量record定义
        }
    }
    handler.post(runnable)
}

fun stop(view:View){
    handler.removeCallbacks(runnable)
    // 先保存当前计时数值到SharedPreferences,必须调用apply()/commit()才会生效
    sharedPreferences.edit().putInt("record", number).apply()
    // 再重置计时器状态
    number = 0
    textView.text = "Time: 0"
    Toast.makeText(this,"Stopped",Toast.LENGTH_LONG).show()
    button4.setEnabled(false)
    button3.setEnabled(true)
}

关键改动说明

  • 移除Runnable内部的var record = number:这个局部变量完全冗余,全局number已经在实时记录计时器的当前数值。
  • 调整stop()函数的代码顺序:必须先保存number的当前值,再将其重置为0,否则原来的逻辑会把0存入SharedPreferences,而非最终的计时结果。
  • 补充apply()调用:修改SharedPreferences后必须调用apply()(异步保存)或commit()(同步保存),否则修改不会写入本地存储。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 13:54:20