如何以编程方式导致 Android 延迟?
How can I programmatically cause a delay in Android?
我尝试使用 Thread.sleep()
但它没有用。当我使用它时,应用程序停止响应。
我需要像这样在我的代码中添加一些延迟:
public void inicioJogo(){
for (int jogada = 1; jogada <= 50; jogada++) {
for (int contador = 0; contador < jogada; contador++){
// HERE - Wait 1 sec before go to next line.
btPedra[sequencia[contador]].setBackgroundResource(imagensHover[sequencia[contador]]);
// HERE - Wait 1 sec before go to next line.
btPedra[sequencia[contador]].setBackgroundResource(imagensNormal[sequencia[contador]]);
// Now continue looping.
}
}
}
我试过使用 Handler,像这样:
private Handler handler = new Handler();
for (int jogada = 1; jogada <= 50; jogada++) {
for (int contador = 0; contador < jogada; contador++){
handler.postDelayed(new Runnable () {
@Override
public void run() {
btPedra[sequencia[contador]].setBackgroundResource(imagensHover[sequencia[contador]]);
}
}, 1000);
}
}
但是当我使用它时,在等待 1 秒之前循环继续。我需要一个可以停止循环 1 秒的延迟,转到下一行,然后继续循环。
你可以使用ScheduledExecutorService
喜欢
ScheduledExecutorService scheduledExecutorService =
Executors.newScheduledThreadPool(NO_OF_THREADS);
ScheduledFuture scheduledFuture =
scheduledExecutorService.schedule(task, NO_OF_SECONDS_TO_WAIT, TimeUnit.SECONDS);
现在 "task" 在延迟 NO_OF_SECONDS_TO_WAIT
后执行
没有响应的原因是你在当前线程调用了sleep。您正在处理的当前线程是 UI 线程。所以基本上你尝试改变背景,然后让线程休眠以防止它在休眠完成之前真正被改变。
您需要 运行 在另一个线程中循环并休眠,这样它就不会影响主线程:
final Handler handler = new Handler();
new Thread(new Runnable() {
@Override
public void run() {
for (int jogada = 1; jogada <= 50; jogada++) {
for (int contador = 0; contador < jogada; contador++){
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
handler.post(new Runnable() {
@Override
public void run() {
btPedra[sequencia[contador]].setBackgroundResource(imagensHover[sequencia[contador]]);
}
});
}
}
}
}).start();
请注意,后台更改是通过您在启动新线程之前创建的处理程序完成的。该处理程序是在当前线程上创建的,即 UI 线程,发布到它的每条消息都将在该线程上 运行。
所以基本上你循环并在另一个线程上等待,但在 UI 线程上进行背景更改。
我尝试使用 Thread.sleep()
但它没有用。当我使用它时,应用程序停止响应。
我需要像这样在我的代码中添加一些延迟:
public void inicioJogo(){
for (int jogada = 1; jogada <= 50; jogada++) {
for (int contador = 0; contador < jogada; contador++){
// HERE - Wait 1 sec before go to next line.
btPedra[sequencia[contador]].setBackgroundResource(imagensHover[sequencia[contador]]);
// HERE - Wait 1 sec before go to next line.
btPedra[sequencia[contador]].setBackgroundResource(imagensNormal[sequencia[contador]]);
// Now continue looping.
}
}
}
我试过使用 Handler,像这样:
private Handler handler = new Handler();
for (int jogada = 1; jogada <= 50; jogada++) {
for (int contador = 0; contador < jogada; contador++){
handler.postDelayed(new Runnable () {
@Override
public void run() {
btPedra[sequencia[contador]].setBackgroundResource(imagensHover[sequencia[contador]]);
}
}, 1000);
}
}
但是当我使用它时,在等待 1 秒之前循环继续。我需要一个可以停止循环 1 秒的延迟,转到下一行,然后继续循环。
你可以使用ScheduledExecutorService
喜欢
ScheduledExecutorService scheduledExecutorService =
Executors.newScheduledThreadPool(NO_OF_THREADS);
ScheduledFuture scheduledFuture =
scheduledExecutorService.schedule(task, NO_OF_SECONDS_TO_WAIT, TimeUnit.SECONDS);
现在 "task" 在延迟 NO_OF_SECONDS_TO_WAIT
后执行没有响应的原因是你在当前线程调用了sleep。您正在处理的当前线程是 UI 线程。所以基本上你尝试改变背景,然后让线程休眠以防止它在休眠完成之前真正被改变。
您需要 运行 在另一个线程中循环并休眠,这样它就不会影响主线程:
final Handler handler = new Handler();
new Thread(new Runnable() {
@Override
public void run() {
for (int jogada = 1; jogada <= 50; jogada++) {
for (int contador = 0; contador < jogada; contador++){
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
handler.post(new Runnable() {
@Override
public void run() {
btPedra[sequencia[contador]].setBackgroundResource(imagensHover[sequencia[contador]]);
}
});
}
}
}
}).start();
请注意,后台更改是通过您在启动新线程之前创建的处理程序完成的。该处理程序是在当前线程上创建的,即 UI 线程,发布到它的每条消息都将在该线程上 运行。
所以基本上你循环并在另一个线程上等待,但在 UI 线程上进行背景更改。