首页 > 解决方案 > 如何在Android中停止计时器

问题描述

在我的应用程序中我想使用CountDownTimer,为此我写了下面的代码,但我想在某些情况下取消这个计时器,然后不运行这个计时器!

我写下面的代码并取消它,但每隔 1 秒再次运行这个计时器!

我想在调用 timer.cancel 之后,这个计时器已经取消并且不再运行!

我的代码:

    private fun startTimer(timer: Long) {
        calTimeChecker = timer
        countDownTimer = object : CountDownTimer(Long.MAX_VALUE, 1000) {
            @SuppressLint("SetTextI18n")
            override fun onTick(millisUntilFinished: Long) {
                //Calculate time
                calTimeChecker -= 1
                var seconds = (calTimeChecker)
                val hours = seconds / (60 * 60)
                val tempMint = seconds - hours * 60 * 60
                val minutes = tempMint / 60
                seconds = tempMint - minutes * 60
                //This call api with MVP
                presenter.getLastInfo(token, auctionId)
            override fun onFinish() {
                footerCheckingLay.visibility = View.VISIBLE
                auctionDetail_footerInfo.visibility = View.INVISIBLE
                auctionDetail_footerBottom.enableDisableView(false)
                auctionDetail_footerPlusBidBtn.enableDisableView(false)
            }
        }.start()

    override fun loadLastInfoUI(data: BidsRes) {
            cancelTimer()
}

当调用presenter.getLastInfo(token,uctionId) api 时,使用loadLastInfoUI接收这个 api 数据。

    private fun cancelTimer() {
        try {
            Log.e("BidsLog", "Cancel")
            countDownTimer.cancel()
        } catch (e: Exception) {
            e.printStackTrace()
        }
    }

我的日志猫:

2020-08-04 12:28:07.646 30602-30602/com.app.android E/BidsLog: Cancel
2020-08-04 12:28:08.642 30602-30602/com.app.android E/BidsLog: Cancel
2020-08-04 12:28:09.641 30602-30602/com.app.android E/BidsLog: Cancel
2020-08-04 12:28:10.643 30602-30602/com.app.android E/BidsLog: Cancel
2020-08-04 12:28:11.655 30602-30602/com.app.android E/BidsLog: Cancel
2020-08-04 12:28:12.645 30602-30602/com.app.android E/BidsLog: Cancel

为什么从cancelTimer方法调用取消日志后,再次调用此方法而不取消此计时器?

如何取消它并只显示此日志消息一次?

标签: androidkotlintimer

解决方案


您的计时器正在取消。将日志添加到onTick方法,然后调用取消并检查是否onTick不再打印来自的日志以确保您的计时器已取消。您看到的原因"BidsLog: Cancel"是因为取消计时器不会取消记录。


推荐阅读