【问题标题】:How to create timer in Android Studio ( kotlin )?如何在 Android Studio ( kotlin ) 中创建计时器?
【发布时间】:2021-09-25 02:29:21
【问题描述】:

我想在 Android Studio 中使用 kotlin 创建一个程序,我在其中使用计时器,它每 20 毫秒执行一次操作并无限运行。我用过这样的东西:

object : CountDownTimer(10000,20){
   override fun onTick(millisUntilFinished: Long) {

   }
   override fun onFinish() {
      start()
   }
}.start()

但问题是,经过一段时间后,计时器开始变慢,当 1 秒应该过去时,实际上是 6 秒。将动作更改为 40 毫秒或更长时间只会有一点帮助,因为稍后它仍然会变慢。我看到人们使用的计时器实际上可以毫无问题地工作,但它是在 Java 中的,当我尝试在 Android Studio 的帮助下将其更改为 Kotlin 时(我从未使用过 Java),它最终无法正常工作(启动后,该应用程序每次都崩溃)。有人知道如何创建或使用除我上面在 kotlin 中显示的 CountDownTimer 之外的其他计时器吗?

编辑: 我忘了添加适合我的代码。这基本上是我接受的答案,但我必须进行一些更改才能使其正常工作,所以它是:

val timerName = lifecycleScope.launch(Dispatchers.IO) {
   while (isActive) {
      lifecycleScope.launch {
        doSomething()
      }
   delay(20L)
   }
}

【问题讨论】:

  • 你为什么要这样做?
  • @cutiko 我想做一个游戏,每次特定时间都会加分。
  • 如果你使用 Kotlin 编写代码,你可以 launch 一个在循环中延迟 20 毫秒的协程。

标签: android android-studio kotlin timer


【解决方案1】:

这很可能是因为 onTick()onFinish() 中的函数是在计数器工作的同一个协程中调用的,所以您可能需要 launch 那里的另一个协程才能不阻塞计时器范围

此外,这个CountDownTimer API 目前是实验性的,所以我想它并不是真的推荐使用它,也许你可以这样做:

val timerJob = scope.launch(Dispatcher.IO) {
   while (isActive) {
       scope.launch { doSomething() }
       delay(20L)
   }
}

我没有对其进行测试,但它应该具有完全相同的行为(但不会阻塞计时器),它将一直运行到 scope 将自行取消(例如生命周期范围),或者您将通过调用 @987654327 手动取消它@

isActive 布尔值负责检查协程是否仍处于活动状态(因此循环不会“泄漏”)

不幸的是,如果您在这个 doSomething() 调用中运行一些超过 20 毫秒延迟的繁重的东西,将会发生一些并发问题,所以应该很简单

如果你的“游戏”太繁重以至于这 20 毫秒的延迟太小了,那么很可能使用协程并不是你想法的最佳方法

【讨论】:

  • 好的,所以我对此进行了测试,并且效果很好(顺便说一句,您忘记了“调度程序”末尾的“s”)但我想问一下,有没有办法暂停它并恢复我什么时候想要?
  • 不,但是您可以随时致电timerJob.cancel() 暂停它,如果您想恢复它,如果您知道我的意思,您可以重新创建这个工作
  • 不幸的是,我不确定如何重新创建它(如果你不是这个意思,请再次编写相同的代码)
  • 假设这段代码是一个函数,timerJob 是一个类作用域变量,那么你将有 f.e. start() 函数将运行我上面编写的代码示例(分配类作用域变量timerJob),然后会有一个函数pause() 使用对这个timerJob 的引用将调用@ 987654336@,那么如果你想恢复这个定时器,你只需像开始那样使用start()函数重新创建定时器
猜你喜欢
  • 2018-09-10
  • 1970-01-01
  • 2018-09-21
  • 1970-01-01
  • 2021-04-20
  • 2019-06-03
  • 2018-12-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多