2010-12-07 8 views
199

Ich verwende handler.postDelayed(), um eine Wartezeit zu erstellen, bevor die nächste Phase meiner App stattfindet. Während der Wartezeit zeige ich einen Dialog mit Fortschrittsbalken und Schaltfläche Abbrechen.Abbrechen eines Handler.PortDelayed Prozess

Mein Problem ist, ich kann keinen Weg finden, die post-Delayed Aufgabe vor Ablauf der Zeit abzubrechen.

+0

möglich duplicate von [Wie entferne ich ein runnable von einem handler-objekt, das von postDelayed hinzugefügt wurde?] (Http://stackoverflow.com/questions/3627216/how-to-remove-a-runnable-froma-a- handler-object-added-by-postdelayed) – sschuberth

Antwort

399

Ich tue dies ein schreiben runnable verzögert:

myHandler.postDelayed(myRunnable, SPLASH_DISPLAY_LENGTH); 

Und das es zu entfernen: myHandler.removeCallbacks(myRunnable);

+60

Wenn Sie es sich leisten können, alle Callbacks und Nachrichten auf dem Handler abzubrechen und keine Verweise auf das Runnable behalten möchten, ist der dritte Punkt in der akzeptierten Antwort auf diese Frage eine andere Alternative das scheint für meinen Fall trotzdem zu funktionieren: http://stackoverflow.com/questions/11299440/onbackpressed-to-kill-a-handler-within-an-activity-android (im Wesentlichen Aufruf von myHandler.removeCallbacksAndMessages (null);) – Mick

+0

removeCallbacksAndMessages kann den Trick machen, aber persönlich bevorzuge ich die Kontrolle über die geplanten Runnables. Wenn du ein Paar Runnables tust und handelst, werden deine App-Leistungen nicht beeinträchtigt. Wenn Sie mehr als zwei oder drei Runnables benötigen, benötigen Sie möglicherweise etwas, das mächtiger ist, imho. –

14

Ein anderer Weg ist die Runnable selbst zu handhaben:

Runnable r = new Runnable { 
    public void run() { 
     if (booleanCancelMember != false) { 
      //do what you need 
     } 
    } 
} 
+14

Müsste booleanCancelMember nicht endgültig sein, was bedeutet, dass es nicht geändert werden konnte und somit für diesen Zweck nutzlos ist? – stealthcopter

+8

@stealthcopter nein es muss nicht sein. –

+0

Dies geschieht, wenn Sie das Runnable anonymisieren – pablisco

1

Es gearbeitet mir, als ich CancelCallBacks (this) innerhalb des Posts verzögerte Runnable anrief, indem ich es über einen booleschen

überreichte
Runnable runnable = new Runnable(){ 
    @Override 
    public void run() { 
     Log.e("HANDLER", "run: Outside Runnable"); 
     if (IsRecording) { 
      Log.e("HANDLER", "run: Runnable"); 
      handler.postDelayed(this, 2000); 
     }else{ 
      handler.removeCallbacks(this); 
     } 
    } 
}; 
+0

Es gibt keine "CancelCallBacks" in Ihrem Code. Vielleicht, weil es nicht existiert? :) –

12

Bei tun Sie mehrere innere/anonym Runnables müssen gleiche Behandlungsroutine übergeben, und Sie wollen, verwenden

handler.removeCallbacksAndMessages(null);

Per Dokumentation,

Remove

alle auf derselben Veranstaltung abzusagen alle ausstehenden Posts von Callbacks und gesendete Nachrichten, deren Obj Token ist. Wenn Token null ist, werden alle Rückrufe und Nachrichten entfernt.

Verwandte Themen