使用 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);
}
我会得到:
- 等待 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 的新手)。我在某个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)
将执行时间定义为绝对时间
您当前的代码如下:
- 嘿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);
基本上,我正在尝试做比这更复杂的事情,但这是我的问题:
在 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 的新手)。我在某个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)
您当前的代码如下:
- 嘿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);