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
}

45voto

Hossam Ghareeb Punkte 6865

Können Sie den Handler innerhalb von UIThread :

runOnUiThread(new Runnable() {

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

40voto

aryaxt Punkte 73004

Vielen Dank für die vielen guten Antworten, ich habe eine Lösung gefunden, die meinen Bedürfnissen am besten entspricht.

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
    }
}

27voto

Wilson Tran Punkte 2583

Mehr Sicherheit - mit Kotlin Coroutine

Die meisten Antworten verwenden Handler, aber ich gebe eine andere Lösung zu verzögern in Aktivität, Fragment, Ansicht Modell mit Android Lifecycle ext. Dieser Weg wird automatisch abbrechen, wenn der Lebenszyklus beginnt zerstört - Vermeidung von Speicherlecks oder Abstürzen der Anwendung

In Aktivität oder Fragment:

lifecycleScope.launch { 
  delay(DELAY_MS)
  doSomething()
}

In ViewModel:

viewModelScope.lanch {
  delay(DELAY_MS)
  doSomething()
}

In der Suspend-Funktion: (Kotlin Coroutine)

suspend fun doSomethingAfter(){
    delay(DELAY_MS)
    doSomething()
}

Wenn Sie einen Fehler mit der lifecycleScope nicht gefunden! - importieren Sie diese Abhängigkeit in die app gradle-Datei:

implementation "androidx.lifecycle:lifecycle-runtime-ktx:2.4.0"

23voto

OscarRyz Punkte 189898

Siehe diese Demo:

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?");
     }
}

21voto

noob Punkte 18277

Wenn Sie den Handler benutzen müssen, aber in einem anderen Thread sind, können Sie runonuithread um den Handler im UI-Thread auszuführen. Dies bewahrt Sie vor Ausnahmen, die beim Aufruf von Looper.Prepare()

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

Sieht ziemlich chaotisch aus, aber das ist einer der Wege.

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