2010-07-12 9 views
7

Ich muss eine periodische Aufgabe in einer Android-Anwendung ausführen. Ich verwende derzeit einen Timer wie folgt aus:Das Ändern der Android-Systemuhr stoppt die Timer. Wie kann ich sie neu starten?

final Handler guiHandler = new Handler(); 

// the task to run 
final Runnable myRunnable = new Runnable() { 

    @Override 
    public void run() { 
     doMyStuff(); 
    } 
}; 

Timer timer = new Timer(); 
timer.schedule(new TimerTask() { 

    @Override 
    public void run() { 
     guiHandler.post(myRunnable); 
    } 
}, 0, 30000); // run every 30 seconds 

Dies macht genau das, was ich brauche, aber es gibt ein Problem: wenn ich die Zeit auf dem Emulator oder Telefon ändern, stoppt die Zeit läuft. Dies ist, was im Protokoll angezeigt wird, wenn ich die Zeit ändern:

D/SystemClock( 331): Setting time of day to sec=1278920137 
W/SystemClock( 331): Unable to set rtc to 1278920137: Invalid argument 

Nichts über den Timer unterbrochen zu werden, aber es läuft eindeutig nicht mehr, nachdem die Systemuhr geändert hat. Ich brauche die Aufgabe, um die ganze Zeit zu laufen, solange die Anwendung läuft.

Wie kann ich den Timer neu starten, wenn er so gestoppt wird? Es gibt keine Methode auf dem Timer oder der TimerTask, um zu überprüfen, ob es gerade läuft, daher kann ich nicht wissen, wann ich es neu planen soll. Irgendwelche Ideen?

Antwort

3

Ich denke, es gibt ein paar Möglichkeiten, dies zu tun. Ich würde den Timer in beiden Fällen nicht verwenden.

Sie können einen Handler verwenden, um Ihre Aufgabe in einem postDelayed-Aufruf auszuführen. Ihre Aufgabe müsste sich dann von selbst erneut beim Handler registrieren.

Dadurch wird die Aufgabe ausgeführt, während Ihre App lebt. Sie können die verzögerte Rate auch im postDelayed innerhalb der Runnable anpassen. Dieser Weg ist halb vorhersehbar, solange Sie einen anderen Looper machen. Die Verwendung des Hauptthreads kann oder kann nicht geeignet sein, abhängig von der Aufgabe.

Es gibt auch einen AlarmManager, auf den Sie über die Context-Oberfläche zugreifen können, die für wiederkehrende Aufgaben in genaueren Intervallen vorgesehen ist. Es ist ein wenig komplexer zu verwenden, aber Sie erhalten die Flexibilität der Verwendung der RTC und persistent wiederholbare Aufgaben.

Zum Beispiel kann die ausstehende Absicht eine Broadcast-Absicht auslösen, die Sie woanders hören können. Sie können diese ausstehendeInstanz in onCreate Ihres benutzerdefinierten Anwendungsobjekts erstellen und die Absicht in onTerminate() abbrechen.

+0

Das ist eine großartige Lösung, die ich suche! Vielen Dank – JosephT

Verwandte Themen