我现在正在学习Runnable,并且对我找到的代码及其运行方式感到困惑。
j = 0;
public Runnable test = new Runnable() {
@Override
public void run() {
if (j <= 4) { //this is an if statement. shouldn't it run only once?
Log.i("this is j", "j: " + j);
handler.postDelayed(this, 2000); //delays for 2 secs before moving on
}
j++; //increase j. but then why does this loop back to the top?
Log.i("this is j", "incremented j: " + j);
}
};
当我运行它时,每2秒j将从0到4记录。我不明白为什么,但它完全符合我需要每2秒更新一次的数据。
run()只是继续......正在运行吗?这可以解释为什么它会循环,有点。但是如果情况确实如此,那么即使在if语句结束之后,j仍然会自行递增。
任何帮助解释这一点都会有所帮助,谢谢!
答案 0 :(得分:3)
结帐the documentation for Handler.postDelayed(Runnable, long)
:
使Runnable r添加到消息队列中,在指定的时间量过后运行。
postDelayed()
做的是Runnable
个实例,并在给定的延迟后调用其run()
方法。在离开的地方不恢复执行。
在您的情况下,您正在传递this
,Runnable
检查if (j <=4 ))
,如果是,则再次发布相同的runnable,从而再次执行run()
方法
如果你只想在检查j <= 4
之后是否需要延迟,那么你可能需要Thread.sleep()
,它会在给定的时间内睡眠。
答案 1 :(得分:2)
Runnable就是这样:可以运行的代码块。当你将Runnable与Handler一起使用时就会发生魔术,就像你在这里一样。 Handler将接受Runnable并在Handler的线程上调用它们的run()方法。您告诉Handler使用Hander.post()或Handler.postDelayed()运行Runnable。 post()立即运行Runnable,postDelayed()在给定的毫秒数后运行它。
所以run()方法只运行一次,但是这一行:
handler.postDelayed(this, 2000);
告诉处理程序在2000毫秒(2秒)后安排运行 this (即此Runnable)。