web-dev-qa-db-fra.com

Comment retarder une boucle dans Android sans utiliser thread.sleep?

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.

18
user3153613

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

34
sddamico

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();
12
Raghunandan

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); 
6
Cody

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);
1
Imran Ali Khan