【问题标题】:How to cancel CountdownTImer in Android kotlin?如何在 Android kotlin 中取消 CountdownTImer?
【发布时间】:2022-08-16 13:53:50
【问题描述】:

当用户按下后退按钮或最小化应用程序时,我想取消计时器。 我尝试在“override fun onDestroy()”上使用 cancel(),但计时器仍在运行。

下面是我的倒计时代码

countDownTimer = object : CountDownTimer(Constants.timerDuration, 1000) {
        override fun onTick(millisecondFinished: Long) {
            binding?.tvTimer?.text = (millisecondFinished / 1000).toString()

            Log.i(\"millis\", \"onTick: $millisecondFinished\")
        }

        override fun onFinish() {
            val action = GameplayDirections.actionGameplayToGameover()

            findNavController().navigate(action)

        }
    }.start()`

这就是我初始化倒计时变量的方式

private var countDownTimer: CountDownTimer? = null

下面是取消定时器的代码

override fun onDestroy() {
    super.onDestroy()
    countDownTimer.cancel()
    countDownTimer = null
    Log.i(\"destroy\", \"onDestroyView: destroyed\")
    binding = null
}

我已经参考了很多链接,但我仍然无法解决这个问题。即使我按下后退按钮或最小化应用程序,我也可以看到在 logcat 中运行的计时器。

我已经在片段中实现了倒数计时器,计时器完成后我将遍历其他片段。而且由于计时器没有取消,我收到如下所示的错误。

2022-07-24 12:25:15.643 32685-32685/io.ronli.protypist E/AndroidRuntime: FATAL EXCEPTION: main
Process: io.ronli.protypist, PID: 32685
java.lang.IllegalStateException: Fragment Gameplay{735bc2f} (915d1b65-13a2-40f3-b94a-4519fde2252d) not associated with a fragment manager.
    at androidx.fragment.app.Fragment.getParentFragmentManager(Fragment.java:1059)
    at androidx.navigation.fragment.NavHostFragment$Companion.findNavController(NavHostFragment.kt:375)
    at androidx.navigation.fragment.FragmentKt.findNavController(Fragment.kt:29)
    at io.ronli.protypist.ui.Gameplay$startTimer$1.onFinish(Gameplay.kt:325)
    at android.os.CountDownTimer$1.handleMessage(CountDownTimer.java:142)
    at android.os.Handler.dispatchMessage(Handler.java:106)
    at android.os.Looper.loopOnce(Looper.java:210)
    at android.os.Looper.loop(Looper.java:299)
    at android.app.ActivityThread.main(ActivityThread.java:8105)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:556)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1045)
  • 你到底在哪里创建这个CountDownTimer 对象?

标签: android kotlin timer countdowntimer


【解决方案1】:

如果您想在用户按下后退按钮或最小化应用程序时停止计时器,您应该在 onPause 中调用取消方法,如下所示:

override fun onPause() {
        super.onPause()
        countDownTimer.cancel()
}

并且错误与计时器无关。这是关于导航的。您可以在下面看到类似的情况:

Fragment XXX {} not associated with a fragment manager

【讨论】:

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