我的操作需要延迟几秒钟。我正在像这样使用调度程序和计时器:
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?
答案 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!" })