基本上,我正在尝试做一些比这更复杂的事情,但这是我的问题:
在for循环中使用handler.postDelayed时,只在第一次出现延迟,并且每次for循环重复时我等待延迟启动:
例如,在这种情况下:
for(int z=0; z<4; z++) {
final int finalZ = z;
handler.postDelayed(new Runnable() {
@Override
public void run() {
Toast.makeText(play.this, "z:" + finalZ, Toast.LENGTH_SHORT).show();
}
}, 5000);
}
我会得到:
我想要得到的内容:
我被告知不要使用Thread.sleep(),因为它可能导致各种问题(我不太了解它们,因为我是android studio的新手)。我在某个活动中使用它(不是我的Main_Activity)。
我基本上试图在0.5秒左右的时间内改变图像的颜色(更复杂的是,但这是主要的想法)。 Thread.sleep()会更好吗?
编辑:好的,谢谢@tynn&amp; @pskink我让这个工作(见他们的答案)。但是现在,在此之后出现了另一个问题。
例如,如果我之后运行完全相同的代码,它们将同时运行,而不是一个接一个地运行,我怎样才能使第二个“for”启动只有在第一个“for”结束后?
答案 0 :(得分:0)
处理程序在另一个线程上运行您的代码,与您的for循环无关。延迟是相对于您发布runnable的点。与上一篇文章无关。它根本不会阻止for循环。这就是处理程序的目的。
您可以假设此方案中的任何帖子同时发生,因此您可以handler.postDelayed(runnable, (z + 1) * 5000)
。或者可以使用handler.postAtTime(runnable, firstRun + z * 5000)
答案 1 :(得分:0)
您当前的代码是这样的:
然后我们等待5秒,处理程序会在一瞬间执行这些操作。
您可以做的是将其更改为:
或者你可以这样做:
然后处理程序将等待5秒并调用操作'嘿处理程序在5秒后执行此操作'。因此,处理程序必须再等待5s并在此之后再做一些操作。
这是我的aproach的代码:
final int finalZ = z;
delayedAction(handler, 0, z);
. . .
void delayedAction(final Handler handler, final int i, final int max) {
if(i<max) {
Toast.makeText(play.this, "z:" + finalZ, Toast.LENGTH_SHORT).show();
handler.postDelayed(new Runnable() {
@Override
public void run() {
delayedAction(handler, i+1, max);
}
});
}
}
答案 2 :(得分:0)
这是另一个方面
private int z=0;
Runnable r = new Runnable() {
@Override
public void run() {
Toast.makeText(play.this, "z:" + z, Toast.LENGTH_SHORT).show();
if(z<4){
z++;
handler.postDelayed(r, 5000);
}
}
}
handler.post(r);