【问题标题】:CountDownTimer is not cancellingCountDownTimer 没有取消
【发布时间】:2019-11-05 10:15:54
【问题描述】:

这个问题的其他实例都没有解决我的问题。我有一个片段出现在事务序列的末尾。这意味着当其中包含的CountDownTimer 倒计时时关闭应用程序:

class TerminalFragment : Fragment() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
    }

    override fun onStart() {
        super.onStart()
        startOverButton.setOnClickListener {

            returnToStart()
        }

        initUi()

        startCountDown()

    }

    override fun onStop() {
        super.onStop()

        AppLog.i(TAG, "onStop()")

        stopCountdown()

    }
}

private fun startCountDown() {

    terminalCountdown = object : CountDownTimer(5000, 1000) {
        override fun onFinish() {

            AppLog.i(TAG, "Terminal countdown finished")

            (context as MainActivity).finish()
        }

        override fun onTick(millisUntilFinished: Long) {

        }
    }
    .start()
}

private fun stopCountdown() {
    AppLog.i(TAG, "stopCountDown() - Terminal countdown stopped")

    terminalCountdown?.cancel()

    terminalCountdown = null

}

private fun returnToStart() {

    AppLog.i(TAG, "returnToStart()")

    stopCountdown()

    (context as MainActivity).restartFlow()
}

stopCountDown() 每当从 Fragment 导航离开时就会被调用,但它有时会以某种方式存活并从另一个 Fragment 关闭应用程序。使用日志,我还发现有时似乎有 2 个倒计时实例。如何确保此倒计时在此片段之外永远不会激活?

【问题讨论】:

  • "有时会出现 2 次倒计时" -> 如果在任何情况下您的 startCountDown() 被多次调用,则之前的计时器引用将丢失并继续运行
  • 代码看起来不错;您似乎正在正确处理生命周期。 onStop() 总是被称为 1-for-1 和 onStart(),除非你正在做一些非常疯狂的事情......很可能问题出在此处未发布的代码。

标签: android kotlin


【解决方案1】:

作为Shrey Greg mentioned in a comment,每次我想重新启动它时,我都会创建一个CountdownTimer 的新实例。这丢失了对前一个实例的引用,因此无法取消。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多