Java Android-Studio Funktion die sich jede Sek. startet?
Hallo Leute, wie oben zu erkennen ist, suche ich eine Möglichkeit, eine Funktion zu definieren, die sich jede Sekunde auslöst. Also quasi das Bild updatet. :)
2 Antworten
Dazu gibt es verschiedene Varianten. Wenn dich eine zunehmende zeitliche Abweichung nicht stört, kannst du einen Handler (https://developer.android.com/reference/android/os/Handler.html) nutzen und am Ende der Methode selbige wieder eine Sekunde später einplanen. Weil bis zur neuen Einplanung immer etwas Zeit vergeht, wird die Methode in etwas längeren Intervallen aufgerufen.
Für höhe Präzision gibt es in Java den Timer (https://docs.oracle.com/javase/10/docs/api/java/util/Timer.html), bei diesem stimmt die Anzahl der Ausführungen auch über einen längeren Zeitraum. Einziges Problem ist, dass System.currentTimeMillis() verwendet wird, was von der Systemuhrzeit abhängt.
Zuletzt gibt es noch den ScheduledThreadPoolExecuter (https://developer.android.com/reference/java/util/concurrent/ScheduledThreadPoolExecutor), welcher ähnlich wie der Timer arbeitet, aber eine unabhängige Zeitmessung verwendet und mehrere Threads verwenden kann.
new Thread(new Runnable(){
@Override public void run(){
while(true){
// deine Funktion
try {
Thread.sleep(1000);// ms
} catch(InteruptedException e){}
}
}
}).start();
Weil es einfach ist, Komplexität leicht zu Fehlern führt.
Der Thread wird schon lange in Java angeboten, läuft auf allen Betriebssystemen, auf denen Java läuft. Auch ohne Android.
Korrekt implementierte Lösungen aus der Java SE und dem Android Framework sind weit einfacher zu verwenden, als einen eigenen Thread zu schreiben und bieten auch zusätzliche Funktionalität. Mit deiner Variante kann man nicht mal die Ausführung beenden, außer man verwendet Methoden, die zurecht als deprecated markiert sind.
Nach so einer Logik dürfte man auch keine Java Collections verwenden, weil diese "komplex" sind.
Die Ausführung kann man einigermaßen beenden. Einfach ein statischer boolean statt true, der onPause und onQuit und so auf false gesetzt wird, die App noch ein wenig wartet.
Macht man nun die Warteschritte kürzer, so ist die Extrawartezeit im Bereich von wenigen Frames, falls überhaupt. (abgesehen davon, dass keine wichtige Logik in solch einer Clock sein sollte, sodass ein Abschuss kein Schaden ist)
Die Ausführung kann man einigermaßen beenden. Einfach ein statischer boolean statt true, der onPause und onQuit und so auf false gesetzt wird, die App noch ein wenig wartet.
Statischer boolean? Hast du überhaupt Ahnung, wovon du redest? Man nutzt hier einfach Thread.interrupted().
Macht man nun die Warteschritte kürzer, so ist die Extrawartezeit im Bereich von wenigen Frames, falls überhaupt. (abgesehen davon, dass keine wichtige Logik in solch einer Clock sein sollte, sodass ein Abschuss kein Schaden ist)
Es lässt sich unmöglich vorhersagen, wie lange die Ausführung tatsächlich dauert, wodurch sich die Abweichung über etwas größere Zeiträume klar bemerkbar macht. Deswegen greifen richtige Timer auf Methoden wie System.nanoTime() zurück, wodurch man auch über große Zeiträume praktisch keine Abweichung hat.
So sieht eine richtige Implementierung aus, und die ist eben zwangsläufig komplex: https://github.com/openjdk-mirror/jdk7u-jdk/blob/master/src/share/classes/java/util/Timer.java
Das ist weder präzise noch effizient. Wieso verwendet man nicht einfach das, was schon angeboten wird und auch besser funktioniert?