Je voulais retarder une boucle for sans utiliser Thread.sleep
car cette méthode fait bloquer toute mon application. J'ai essayé d'utiliser handler
mais cela ne semble pas fonctionner dans une boucle. Quelqu'un peut-il signaler l'erreur dans mon code?.
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);
}
}
}
Fondamentalement, ce que je voulais faire, c'est que j'ai obtenu 4 ImageButton
et je change chacun de leur arrière-plan en rouge en utilisant une boucle dans l'ordre. C'est pourquoi j'ai besoin d'un délai à l'intérieur de ma boucle, sinon tous les ImageButton
vont juste directement devenir rouges sans montrer quel ImageButton
tourner en premier.
Votre boucle for devrait être:
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 cette façon, il atteint le comportement souhaité en échelonnant le changement de couleur.
Modifié pour la syntaxe
Vous pouvez utiliser une boucle Handler
au lieu de for. Vous ne devez pas appeler Thread.sleep()
sur le thread d'interface utilisateur.
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();
Le code suivant effectue la tâche à chaque seconde:
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);
Essaye ça :
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);
}
}
}
Exemple de retard:
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);