java - studio - ¿Cómo retrasar un bucle en Android sin usar thread.sleep?
sleep android studio (4)
Quería retrasar un bucle for sin usar Thread.sleep
porque ese método hace que toda mi aplicación se cuelgue. Intenté usar el handler
pero no parece funcionar dentro de un bucle. Alguien por favor puede señalar el error en mi código.
public void onClick(View v) {
if (v == start)
{
for (int a = 0; a<4 ;a++) {
Handler handler1 = new Handler();
handler1.postDelayed(new Runnable() {
ImageButton[] all= {btn1, btn2, btn3, btn4};
btn5 = all[random.nextInt(all.length)];
btn5.setBackgroundColor(Color.RED);
@Override
public void run() {
}
}, 1000);
}
}
}
Básicamente, lo que quería hacer es que obtuve 4 ImageButton
y cambio cada uno de sus fondos a rojo usando un bucle en orden. Es por eso que necesito un retraso dentro de mi bucle, si no todo el ImageButton
volverá rojo directamente sin mostrar qué ImageButton
gira primero.
El siguiente código haciendo la tarea en cada segundo:
final Handler handler = new Handler();
Runnable task = new Runnable() {
@Override
public void run() {
Log.d(TAG, "Doing task");
handler.postDelayed(this, 1000);
}
};
handler.post(task);
Prueba esto :
public void onClick(View v) {
if (v == start) {
for (int a = 0; a<4 ;a++) {
Handler handler1 = new Handler();
handler1.postDelayed(new Runnable() {
ImageButton[] all= {btn1, btn2, btn3, btn4};
@Override
public void run() {
btn5 = all[random.nextInt(all.length)];
btn5.setBackgroundColor(Color.RED);
}
}, 1000);
}
}
}
Ejemplo de retraso:
final Handler handler = new Handler();
handler.postDelayed(new Runnable() {
@Override
public void run() {
// Do something after 5s = 5000ms
buttons[inew][jnew].setBackgroundColor(Color.Red);
}
}, 5000);
Puedes usar un Handler
lugar de for loop. No debe llamar a Thread.sleep()
en el subproceso de la interfaz de usuario.
final Handler handler = new Handler();
final Runnable runnable = new Runnable() {
@Override
public void run() {
// do something
handler.postDelayed(runnable, 1000L); // 1 second delay
}
};
runnable.run();
Tu bucle for debe ser:
final ImageButton[] all= {btn1, btn2, btn3, btn4};
Handler handler1 = new Handler();
for (int a = 1; a<=all.length ;a++) {
handler1.postDelayed(new Runnable() {
@Override
public void run() {
ImageButton btn5 = all[random.nextInt(all.length)];
btn5.setBackgroundColor(Color.RED);
}
}, 1000 * a);
}
}
De esta manera logra el comportamiento deseado de escalonar el cambio de color.
Editado para sintaxis