【问题标题】:Having A Timer Use The Main Thread in Kotlin让定时器使用 Kotlin 中的主线程
【发布时间】:2020-05-05 05:18:10
【问题描述】:

我有一个需要延迟几秒钟的操作。我正在像这样使用调度程序和计时器:

import java.util.Timer
import kotlin.concurrent.timerTask

 val timer = Timer()
        sliderLastAdjusted = System.currentTimeMillis()

        timer.schedule(timerTask {
            val newTime = System.currentTimeMillis()
            val elapsedTime = newTime - sliderLastAdjusted

            if (elapsedTime > 2000) {

                masterViewModel.updateLeagueProjections()
            }
        }, 2000)

虽然这适用于执行延迟时间的命令并阻止同一时间段内的其他命令执行,但它确实使用主线程 - 这会在更新 observables 时导致问题。

我怎样才能让它使用 MainThread?

【问题讨论】:

    标签: android kotlin


    【解决方案1】:

    您可以使用从主线程(例如在活动中)声明时将附加到它的处理程序,

    你可以试试这个:

    val delayedHandler = Handler()
    delayedHandler.postDelayed({
    //// Your Code
    }, 2000)
    

    或者你也可以保留你的Timer,简单的在定时器外面声明一个Handler,然后使用你的Timer中的Handler post()方法

    【讨论】:

      【解决方案2】:

      您可以扩展 timerTask 以在主线程上返回。 基本上,得到一个在主线程上运行的 Hander:

      Handler handler = new Handler(Looper.getMainLooper());
      handler.post(new Runnable() {
           public void run() {
                // UI code goes here
           }
      });
      

      然后让 timerTask 在上面的 run 方法中执行它的函数参数。或者,您可以只在 lambda 中包含该代码,甚至可以使用 activity.runOnUiThread()。真正正确的解决方案归结为您在代码中执行此操作的频率,其中仅使用runOnUiThread

      【讨论】:

        【解决方案3】:

        虽然前面的答案是有效的,但它们不是很 kotlin

        更好的是这样的

        Handler(mainLooper).post { someTextView.text = "Hello world!" }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2017-04-09
          • 1970-01-01
          • 2018-12-29
          • 2020-05-21
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多