首页 > 解决方案 > 如何在 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()
  }
}

标签: androidkotlincountdowntimer

解决方案


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()
}

推荐阅读