使用 handler.postDelayed 和 "for"

Using handler.postDelayed with "for"

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

在 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 的新手)。我在某个activity(不是我的Main_Activity)中使用这个。

我基本上是尝试每隔 0.5 秒左右改变一次图像的颜色(这会带来更多的复杂性,但这是主要思想)。 Thread.sleep() 会更好吗?

编辑: 好的,多亏了@tynn 和@pskink,我才开始工作(见他们的回答)。但是现在,随之而来的又是一个问题

例如,如果我将 运行 完全 之后的相同代码,它们将同时 运行,而不是一个又一个,我怎样才能让第二个"for"只在第一个"for"结束后才开始?

处理程序在另一个线程上运行您的代码,独立于您的 for 循环。延迟与您 post 运行可运行程序的时间点有关。不相对于之前的post。此外,它根本不会阻止 for 循环。这就是处理程序的目的。

您可以假设此场景中的任何 post 同时发生,因此您可以只做 handler.postDelayed(runnable, (z + 1) * 5000)。或者可以使用 handler.postAtTime(runnable, firstRun + z * 5000)

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

但由于您正在尝试做比这更复杂的事情,您最好考虑使用 Timer or similar. Maybe RxJava

您当前的代码如下:

  • 嘿handler,5秒后做,
  • 哦,5秒后也做,
  • 5秒后也做,
  • 请在 5 秒后执行此操作。

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

您可以将其更改为:

  • 嘿handler,5秒后做,
  • 哦,10秒后做,
  • 15 秒后
  • ...

或者你可以这样做:

  • 嘿处理程序在 5 秒后执行 it,其中“it”操作是 'hey handler do it after 5s'。

然后处理程序将等待 5 秒并调用操作 'hey handler do it after 5s'。因此处理程序将不得不再次等待 5 秒并在该时间之后执行一些操作。

这是我的方法的代码:

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

这是另一个方面

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