studio java android loops delay

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