web-dev-qa-db-fra.com

Comment définir le délai dans Android?

public void onClick(View v) {
        // TODO Auto-generated method stub
        switch(v.getId()){
        case R.id.rollDice:
            Random ranNum = new Random();
            int number = ranNum.nextInt(6) + 1;
            diceNum.setText(""+number);
            sum = sum + number;
            for(i=0;i<8;i++){
                for(j=0;j<8;j++){

                    int value =(Integer)buttons[i][j].getTag();
                    if(value==sum){
                        inew=i;
                        jnew=j;

                        buttons[inew][jnew].setBackgroundColor(Color.BLACK);
                                                //I want to insert a delay here
                        buttons[inew][jnew].setBackgroundColor(Color.WHITE);
                         break;                     
                    }
                }
            }


            break;

        }
    }

Je veux définir un délai entre la commande entre changer de fond. J'ai essayé d'utiliser un minuteur de fil et essayé d'utiliser run et catch. Mais ça ne marche pas. J'ai essayé ça

 Thread timer = new Thread() {
            public void run(){
                try {
                                buttons[inew][jnew].setBackgroundColor(Color.BLACK);
                    sleep(5000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }

             }
           };
    timer.start();
   buttons[inew][jnew].setBackgroundColor(Color.WHITE);

Mais cela ne fait que devenir noir.

136

Essayez ce code:

final Handler handler = new Handler();
handler.postDelayed(new Runnable() {
    @Override
    public void run() {
        // Do something after 5s = 5000ms
        buttons[inew][jnew].setBackgroundColor(Color.BLACK);
    }
}, 5000);
415
Tuan Vu

Vous pouvez utiliser CountDownTimer qui est beaucoup plus efficace que toute autre solution publiée. Vous pouvez également produire des notifications régulières sur les intervalles le long du chemin en utilisant sa méthode onTick(long)

Regardez cet exemple montrant un compte à rebours de 30 secondes

   new CountDownTimer(30000, 1000) {
         public void onFinish() {
             // When timer is finished 
             // Execute your code here
     }

     public void onTick(long millisUntilFinished) {
              // millisUntilFinished    The amount of time until finished.
     }
   }.start();
31
Sufiyan Ghori

Si vous utilisez souvent le délai dans votre application, utilisez cette classe d'utilitaires.

import Android.os.Handler;


public class Utils {

    // Delay mechanism

    public interface DelayCallback{
        void afterDelay();
    }

    public static void delay(int secs, final DelayCallback delayCallback){
        Handler handler = new Handler();
        handler.postDelayed(new Runnable() {
            @Override
            public void run() {
                delayCallback.afterDelay();
            }
        }, secs * 1000); // afterDelay will be executed after (secs*1000) milliseconds.
    }
}

Usage:

// Call this method directly from Java file

int secs = 2; // Delay in seconds

Utils.delay(secs, new Utils.DelayCallback() {
    @Override
    public void afterDelay() {
        // Do something after delay

    }
});
21
aruke

Utilisation de la méthode Thread.sleep(millis).

15
user2270457

Si vous voulez faire quelque chose dans l'interface utilisateur à des intervalles de temps réguliers, une très bonne option consiste à utiliser CountDownTimer:

new CountDownTimer(30000, 1000) {

     public void onTick(long millisUntilFinished) {
         mTextField.setText("seconds remaining: " + millisUntilFinished / 1000);
     }

     public void onFinish() {
         mTextField.setText("done!");
     }
  }.start();
3
Ivo Stoyanov

vous pouvez utiliser ceci:

import Java.util.Timer;

et pour le retard lui-même ajouter:

 new Timer().schedule(
                    new TimerTask(){

                        @Override
                        public void run(){

                        //if you need some code to run when the delay expires
                        }

                    }, delay);

La variable "delay" représente les millisecondes. Par exemple, définissez un délai de 5 000 à 5 secondes.

2
Dror

Handler répond à Kotlin:

1 - Créez une fonction de niveau supérieur dans un fichier (par exemple, un fichier contenant toutes vos fonctions de niveau supérieur):

fun delayFunction(function: ()-> Unit, delay: Long) {
    Handler().postDelayed(function, delay)
}

2 - Puis appelez-le n'importe où vous en avez besoin:

delayFunction({ myDelayedFunction() }, 300)
1
Phil

Voici un exemple où je change l’image d’arrière-plan d’une image à l’autre avec un délai alpha de 2 secondes dans les deux sens - Fondu 2 secondes de l’image d’origine en fondu 2 secondes dans la deuxième image.

    public void fadeImageFunction(View view) {

    backgroundImage = (ImageView) findViewById(R.id.imageViewBackground);
    backgroundImage.animate().alpha(0f).setDuration(2000);

    // A new thread with a 2-second delay before changing the background image
    new Timer().schedule(
            new TimerTask(){
                @Override
                public void run(){
                    // you cannot touch the UI from another thread. This thread now calls a function on the main thread
                    changeBackgroundImage();
                }
            }, 2000);
   }

// this function runs on the main ui thread
private void changeBackgroundImage(){
    runOnUiThread(new Runnable() {
        @Override
        public void run() {
            backgroundImage = (ImageView) findViewById(R.id.imageViewBackground);
            backgroundImage.setImageResource(R.drawable.supes);
            backgroundImage.animate().alpha(1f).setDuration(2000);
        }
    });
}
0
MuharizJ