使用handler.postDelayed和“for”

时间:2017-03-25 16:23:11

标签: android for-loop android-handler

基本上,我正在尝试做一些比这更复杂的事情,但这是我的问题:

在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);
    }

我会得到:

  • 等待5秒钟。
  • Z:0
  • Z:1
  • Z:2
  • Z:3

想要得到的内容:

  • 等待5秒钟。
  • Z:0
  • 等待5秒钟。
  • Z:1
  • 等待5秒钟。
  • Z:2
  • 等待5秒钟。
  • Z:3

我被告知不要使用Thread.sleep(),因为它可能导致各种问题(我不太了解它们,因为我是android studio的新手)。我在某个活动中使用它(不是我的Main_Activity)。

我基本上试图在0.5秒左右的时间内改变图像的颜色(更复杂的是,但这是主要的想法)。 Thread.sleep()会更好吗?

编辑:好的,谢谢@tynn&amp; @pskink我让这个工作(见他们的答案)。但是现在,在此之后出现了另一个问题。

例如,如果我之后运行完全相同的代码,它们将同时运行,而不是一个接一个地运行,我怎样才能使第二个“for”启动只有在第一个“for”结束后?

3 个答案:

答案 0 :(得分:0)

处理程序在另一个线程上运行您的代码,与您的for循环无关。延迟是相对于您发布runnable的点。与上一篇文章无关。它根本不会阻止for循环。这就是处理程序的目的。

您可以假设此方案中的任何帖子同时发生,因此您可以handler.postDelayed(runnable, (z + 1) * 5000)。或者可以使用handler.postAtTime(runnable, firstRun + z * 5000)

将执行时间定义为绝对时间

但是,既然你正在尝试做一些比这更复杂的事情,你最好考虑使用Timer或类似的东西。也许是RxJava

答案 1 :(得分:0)

您当前的代码是这样的:

  • 嘿处理程序,在5s后执行,
  • 哦,也是在5s之后再做,
  • 并在5秒后完成,
  • 这个PLZ在5s之后完成。

然后我们等待5秒,处理程序会在一瞬间执行这些操作。

您可以做的是将其更改为:

  • 嘿处理程序,在5s后执行,
  • 哦,10秒后再做,
  • 以及15秒后的
  • ...

或者你可以这样做:

  • hey处理程序在5s之后执行 it ,其中' it '操作是'嘿处理程序在5s之后执行'。

然后处理程序将等待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);