2013-02-04 7 views
6

Das Android Handler Klasse diese Methode enthält:Handler.postAtTime vs Handler.postDelayed

public final boolean postAtTime (Runnable r, Object token, long uptimeMillis) 

ein Runnable zu einem bestimmten Zeitpunkt zu veröffentlichen. Die token kann später verwendet werden, um den Rückruf zu r aus der Nachrichtenwarteschlange dank dieser Methode zu entfernen:

public final void removeCallbacks (Runnable r, Object token) 

Die folgende Methode nicht in der Handler-Klasse

public final boolean postDelayed (Runnable r, Object token, long delay) 

es existiert Ist ein guter Grund, eine solche Methode nicht anzubieten?

+0

Was fehlt Ihnen dort? Das Token? –

+0

ja das Token und so die Fähigkeit, Callback zu etwas, das mit postDelayed – ben75

+0

geschrieben wurde entfernen Sie können immer 'Handler.removeCallbacks()' mit Ihrem Runnable aufrufen. Funktioniert hervorragend, wenn Sie mich fragen. –

Antwort

5

Nach dem Quellcode sucht, übergibt das Token-Objekt schließlich zur Nachricht:

public final boolean postAtTime(Runnable r, Object token, long uptimeMillis) 
308 { 
309  return sendMessageAtTime(getPostMessage(r, token), uptimeMillis); 
310 } 

private static Message getPostMessage(Runnable r, Object token) { 
608  Message m = Message.obtain(); 
609  m.obj = token; 

Und postDelay

public final boolean postDelayed(Runnable r, long delayMillis) 
330 { 
331  return sendMessageDelayed(getPostMessage(r), delayMillis); 
332 } 

Wenn

, was Sie wollen, ist
public final boolean postDelayed (Runnable r, Object token, long delay) 

Warum nicht nur verwenden

public final boolean postAtTime (Runnable r, Object token, long uptimeMillis) 

seit es das gleiche ist.

aktualisieren, vergaß hinzuzufügen:

public final boolean sendMessageDelayed(Message msg, long delayMillis) 
442 { 
443  if (delayMillis < 0) { 
444   delayMillis = 0; 
445  } 
446  return sendMessageAtTime(msg, SystemClock.uptimeMillis() + delayMillis); 
447 } 
+0

ok ... so scheint es, es gibt keinen guten Grund, nicht 'postDelayed (Runnable r, Objekt Token, lange Verzögerung)' in der API – ben75

+0

Ja, aber Sie können es immer den Android-Gruppen vorschlagen. – wtsang02

+0

Von was es aussieht, war das Token-Objekt ein nachträglicher Einfall in der Handler-Klasse, so dass die Klasse etwas unvollständig ist. – DeeV

0

Um ein postDelayed runnable r aus einem Handler H zu entfernen, rufen Sie einfach H.removeCallbacks (r). Warum brauchst du ein Token?

+0

Soweit ich verstehe, können Sie mit dem Token nur einige Callbacks zu r auswählen (wenn das Runnable mehrfach gepostet wird) – ben75

+0

Ok, ich sehe, wenn Sie dieses Token wirklich mit einem postDelayed Runnable benötigen, können Sie die Handler Klasse auf erweitern fügen Sie ein Token-Attribut hinzu und erstellen Sie Ihre eigene postDelayed-Methode mit diesem Token:/ – psykhi

2

Mit Blick auf Handler Quelle, scheint es, dass es:

private final Message getPostMessage(Runnable r, Object token) { 
    Message m = Message.obtain(); 
    m.obj = token; 
    m.callback = r; 
    return m; 
} 

die für kopiert werden können, was Sie wollen: Statt Aufruf postDelayed, wickeln Sie Ihre runnable in einer solchen Nachricht

sendMessageDelayed(getPostMessage(r, token), delayMillis); 

können Sie dann verwenden removeCallbacks() mit Token als param

+0

Aber es erfordert, dass Sie mit Nachrichten umgehen, was ich selten tue, weil es bedeutet, dass ich den Handler nicht sofort verwenden kann. –

+0

ja du kannst. Die Nachricht wird tatsächlich Handler.handleMessage erreichen, aber die Standardimplementierung ist das Ausführen der Message.callback. Wenn Sie sich den Code für Handler.post (Runnable) ansehen, erstellt er eine Nachricht auf die gleiche Weise, die ich gepostet habe – njzk2

+0

Sie haben Recht. Ich habe einen Fehler gemacht, als ich kommentiert habe. –

Verwandte Themen