Question Comment appeler une méthode après un délai dans Android


Je veux être en mesure d'appeler la méthode suivante après un délai spécifié.  Dans l'objectif c, il y avait quelque chose comme:

[self performSelector:@selector(DoSomething) withObject:nil afterDelay:5];

Y at-il un équivalent de cette méthode dans Android avec Java? Par exemple, je dois être en mesure d'appeler une méthode après 5 secondes.

public void DoSomething()
{
     //do something here
}

574
2018-06-18 18:24


origine


Réponses:


Meilleure version:

final Handler handler = new Handler();
handler.postDelayed(new Runnable() {
  @Override
  public void run() {
    //Do something after 100ms
  }
}, 100);

1469
2018-02-06 19:55



Je ne pouvais utiliser aucune des autres réponses dans mon cas. J'ai utilisé le Timer java natif à la place.

new Timer().schedule(new TimerTask() {          
    @Override
    public void run() {
        // this code will be executed after 2 seconds       
    }
}, 2000);

258
2018-06-23 01:16



Remarque: Cette réponse a été donnée lorsque la question n'a pas précisé Android comme contexte. Pour une réponse spécifique au fil de l'interface utilisateur Android regarde ici.


Il semble que l'API Mac OS laisse le thread en cours continuer et planifie l'exécution de la tâche de manière asynchrone. En Java, la fonction équivalente est fournie par le java.util.concurrent paquet. Je ne suis pas sûr quelles limitations Android pourraient imposer.

private static final ScheduledExecutorService worker = 
  Executors.newSingleThreadScheduledExecutor();

void someMethod() {
  ⋮
  Runnable task = new Runnable() {
    public void run() {
      /* Do something… */
    }
  };
  worker.schedule(task, 5, TimeUnit.SECONDS);
  ⋮
}

177
2018-06-18 18:51



Pour l'exécution de quelque chose dans le thread de l'interface utilisateur après 5 secondes:

new Handler(Looper.getMainLooper()).postDelayed(new Runnable() {
    @Override
    public void run() {
        //Do something here
    }
}, 5000);

89
2018-01-27 15:22



vous pouvez utiliser Handler dans UIThread:

runOnUiThread(new Runnable() {

    @Override
    public void run() {
         final Handler handler = new Handler();
         handler.postDelayed(new Runnable() {
           @Override
           public void run() {
               //add your code here
           }
         }, 1000);

    }
});

35
2018-03-22 01:57



Merci pour toutes les bonnes réponses, j'ai trouvé la solution qui correspond le mieux à mes besoins.

Handler myHandler = new DoSomething();
Message m = new Message();
m.obj = c;//passing a parameter here
myHandler.sendMessageDelayed(m, 1000);

class DoSomething extends Handler {
    @Override
    public void handleMessage(Message msg) {
      MyObject o = (MyObject) msg.obj;
      //do something here
    }
}

34
2018-06-18 19:28



Si vous devez utiliser le gestionnaire, mais vous êtes dans un autre thread, vous pouvez utiliser runonuithread pour exécuter le gestionnaire dans le thread UI. Cela vous sauvera des exceptions lancées demandant d'appeler Looper.Prepare()

runOnUiThread(new Runnable() {
    @Override
    public void run() {
        new Handler().postDelayed(new Runnable() {
            @Override
            public void run() {
                //Do something after 1 second
            }
        }, 1000);
    }
});

Ça a l'air assez en désordre, mais c'est l'un des moyens.


19
2018-02-04 08:47



Voir cette démo:

import java.util.Timer;
import java.util.TimerTask;

class Test {
     public static void main( String [] args ) {
          int delay = 5000;// in ms 

          Timer timer = new Timer();

          timer.schedule( new TimerTask(){
             public void run() { 
                 System.out.println("Wait, what..:");
              }
           }, delay);

           System.out.println("Would it run?");
     }
}

18
2018-06-18 18:45