android - 如何在 Kotlin 中恢复暂停的 CountDownTimer
问题描述
这个想法是制作一个国际象棋时钟。但问题是在不重置或创建新实例的情况下恢复暂停的 CountDownTimer 实例。
第一个动作是触摸“白色按钮”并调用方法“startTimerBlack”:黑色定时器开始运行,白色定时器暂停。
当“黑色按钮”被触摸时,“startTimerWhite”被调用:白色定时器开始运行,黑色定时器暂停。
当再次触摸白色按钮时,黑色计时器应该恢复,但不是。
class MainActivity : AppCompatActivity() {
enum class TimerState {
Stopped, Paused, Running
}
private lateinit var timerWhite: CountDownTimer
private lateinit var timerBlack: CountDownTimer
private var timerStateWhite = TimerState.Stopped
private var timerStateBlack = TimerState.Stopped
private var secondsRemaining = 0L
override fun onCreate(savedInstanceState: Bundle?) {
requestWindowFeature(Window.FEATURE_NO_TITLE)
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
buttonWhite.setOnClickListener { v ->
println("white")
startTimerBlack()
}
buttonBlack.setOnClickListener { v ->
println("black")
startTimerWhite()
}
}
private fun startTimerWhite() {
if(timerStateBlack != TimerState.Stopped) {
timerBlack.cancel()
timerStateBlack = TimerState.Paused
}
timerStateWhite = TimerState.Running
timerWhite = object : CountDownTimer(1000 * 1000, 1000) {
override fun onTick(millisUntilFinished: Long) {
secondsRemaining = millisUntilFinished / 1000
buttonWhite.text = secondsRemaining.toString()
}
override fun onFinish() {}
}.start()
}
private fun startTimerBlack() {
if(timerStateWhite != TimerState.Stopped) {
timerWhite.cancel()
timerStateWhite = TimerState.Paused
}
timerStateBlack = TimerState.Running
timerBlack = object : CountDownTimer(secondsRemaining, 1000) {
override fun onTick(millisUntilFinished: Long) {
secondsRemaining = millisUntilFinished / 1000
buttonBlack.text = secondsRemaining.toString()
}
override fun onFinish() {
}
}.start()
}
}
解决方案
timerWhite = object : CountDownTimer(1000 * 1000, 1000)
如果我是正确的,一旦 timerWhite 开始它的第一个滴答声,上述内容总是会将您重置secondsRemaining
为。999000 / 1000 = 999
因此,whiteTimer 总是在值 1000s 处重新启动,而 blackTimer 总是在 whiteTimer 停止时剩余的时间开始。
如果我正确理解国际象棋时钟,您应该为每个计时器保存单独的时间。如下所示:
private var whiteSecondsRemaining = 1000
private var blackSecondsRemaining = 1000
...
timerWhite = object : CountDownTimer(whiteSecondsRemaining , 1000) {
// update whiteSecondsRemaining in onTick()
}
...
timerBlack = object : CountDownTimer(blackSecondsRemaining , 1000) {
// update blackSecondsRemaining in onTick()
}
推荐阅读
- html - 如何通过 CSS 设置 SVG > 图像代码(无路径)的样式?
- php - 如何在数组中定义页面?
- html - 为什么thunderbird会移动html header的样式?
- algorithm - 如何在飞镖中更新地图的键
- mpandroidchart - MPAndroidChart - 使 xaxis 间距相对
- spring-boot - 如何通过 Spring 注释创建具有索引排序的 Elasticsesearch 索引
- html - 打开页面时的 CSS 不透明度过渡
- c# - 如何在 ASP.NET Core 3.1 MVC 中设置 wkhtmltopdf 选项?
- python - 使用 python 代码从修改后的 csv 文件写入 csv
- python - 从 nlp 对象制作列表不起作用,而 spacy 讲座采用这种方法