让计时器使用Koltin中的主线程

时间:2019-04-08 20:16:30

标签: android kotlin

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

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)

虽然这样做可以延迟执行命令,并且可以阻止同一时间段内的其他命令执行,但它确实使用了主线程-在更新可观察对象时会引起问题。

如何使用MainThread?

3 个答案:

答案 0 :(得分:1)

您可以使用一个处理程序,该处理程序在从主线程声明时(例如在Activity中)将附加到该处理程序上,

您可以尝试以下方法:

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

或者您也可以保留Timer,只需在计时器外部声明一个Handler,然后使用Timer中的Handler post()方法

答案 1 :(得分:1)

您可以扩展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就可以了。

答案 2 :(得分:0)

尽管前面的答案都行得通,但不是很科特琳

更好的是这样的

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