2014-04-03 17 views
5

Ich postDelayed Methode des Handler um eine Aktion nach der bestimmten Zeit auszuführen mit:Wie ändere/setze ich die verzögerte Zeit des Handler-Posts?

private static int time_to_wait = 2000; 

Handler handler = new Handler(); 
handler.postDelayed(new Runnable() { 
    public void run() { 
    // Make Action 
    } 
}, time_to_wait); 

jetzt in der Mitte der Wartezeit möchte ich den Wert der verbleibenden Millisekunden aufgrund sich ändern einige Verarbeitungsergebnisse, lassen Sie uns sagen, dass es jetzt gewartet 1000 ms und ich möchte es von wieder zu zählen beginnt, So setze ich den time_to_wait Wert auf 2000, aber es dauert nicht, dass es zählen, wie es nur dauert der var-Wert (2000) und wartet nur diese Zeit unabhängig von der Änderung der time_to_wait Wert auf einen anderen Wert.

+1

Sie müssen die Runnable abbrechen und neu posten, glaube ich. [Stackoverflow] [1] [1]: http://stackoverflow.com/questions/7407242/how-to-cancel-handler-postdelayed – Kaediil

+0

@Kaediil das sein wird nicht so effizient in meinem Fall –

+0

'int' ist ein primitiver Typ und wird als Wert übergeben - der Wert wird kopiert und ist sowieso nicht mit der originalen Primitivvariablen verbunden. Wenn Sie die Variable 'int' an eine Methode übergeben und dann versuchen, diese Variable an einer anderen Stelle (außerhalb dieser Methode) zu ändern, werden die Änderungen an der Variablen nicht in dieser Methode wiedergegeben, da sie eine eigene Kopie der Variablen – Drew

Antwort

7

Dies kann erreicht werden, indem einfach ein Runnable erstellt wird, das vom Handler angezeigt wird, dann wird der Handler als statisches Member erstellt, und wenn Sie ihn beenden möchten, entfernen Sie einfach den Callback Ihres erstellten Runnable, und wenn Sie möchten starte es neu Sie müssen den Rückruf entfernen und neu zuweisen:

Runnable myRunnable = new Runnable() { 
    @Override 
    public void run() { 
     // your code here 
    } 
}; 

public static Handler myHandler = new Handler(); 
private static final int TIME_TO_WAIT = 2000; 

public void start() { 
    myHandler.postDelayed(myRunnable, TIME_TO_WAIT); 
} 

public void stop() { 
    myHandler.removeCallbacks(myRunnable); 
} 

public void restart() { 
    myHandler.removeCallbacks(myRunnable); 
    myHandler.postDelayed(myRunnable, TIME_TO_WAIT); 
} 
0

Sie können nur versuchen,

handler.removeMessage(what) 
handler.sendMessageDelayed(time_to_wait + INTERVER); 

jedes Mal, wenn Sie erste Nachricht entfernen müssen und dann eine neue Nachricht senden.

Verwandte Themen