917 Stimmen

Wie man eine Methode nach einer Verzögerung in Android aufruft

Ich möchte in der Lage sein, die folgende Methode nach einer bestimmten Verzögerung aufzurufen. In Objective C gab es etwas wie:

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

Gibt es ein Äquivalent zu dieser Methode in Android mit Java? Ich muss zum Beispiel in der Lage sein, eine Methode nach 5 Sekunden aufzurufen.

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

2197voto

kontinuity Punkte 24917

Kotlin

Handler(Looper.getMainLooper()).postDelayed({
    //Do something after 100ms
}, 100)

Java

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

373voto

Jules Colle Punkte 10421

In meinem Fall konnte ich keine der anderen Antworten verwenden. Ich habe stattdessen den nativen Java Timer verwendet.

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

189voto

erickson Punkte 256579

Anmerkung: Diese Antwort wurde gegeben, wenn in der Frage kein Android als Kontext angegeben war. Für eine Antwort speziell für den Android UI-Thread siehe hier.


Es sieht so aus, als ob die Mac OS-API den aktuellen Thread weiterlaufen lässt und die Aufgabe für die asynchrone Ausführung plant. In Java wird die entsprechende Funktion von der java.util.concurrent Paket. Ich bin mir nicht sicher, welche Einschränkungen Android mit sich bringen könnte.

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

void someMethod() {

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

}

117voto

pomber Punkte 21013

Um etwas im UI-Thread nach 5 Sekunden auszuführen:

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

54voto

Khemraj Sharma Punkte 52006

Kotlin & Java Viele Wege

1. Verwendung von Handler

Handler().postDelayed({
    TODO("Do something")
    }, 2000)

2. Verwendung von TimerTask

Timer().schedule(object : TimerTask() {
    override fun run() {
        TODO("Do something")
    }
}, 2000)

Oder noch kürzer

Timer().schedule(timerTask {
    TODO("Do something")
}, 2000)

Oder am kürzesten wäre

Timer().schedule(2000) {
    TODO("Do something")
}

3. Verwendung von Executors

Executors.newSingleThreadScheduledExecutor().schedule({
    TODO("Do something")
}, 2, TimeUnit.SECONDS)

In Java

1. Verwendung von Handler

new Handler().postDelayed(new Runnable() {
    @Override
    public void run() {
        //Do something
    }
}, 2000);

2. Verwendung von Timer

new Timer().schedule(new TimerTask() {          
    @Override
    public void run() {
        // Do something
    }
}, 2000);

3. Verwendung von ScheduledExecutorService

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

Runnable runnable = new Runnable() {
  public void run() {
      // Do something
  }
  };
worker.schedule(runnable, 2, TimeUnit.SECONDS);

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X