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

