Java Android-Studio Funktion die sich jede Sek. startet?

2 Antworten

Vom Fragesteller als hilfreich ausgezeichnet

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();
imsonoah 
Fragesteller
 22.06.2018, 21:37

Ich danke dir, Kamerad! xD

1
imsonoah 
Fragesteller
 22.06.2018, 22:21

Oder ist es besser Runnable zu implementieren?

0
FireEraser  22.06.2018, 22:24

Das ist weder präzise noch effizient. Wieso verwendet man nicht einfach das, was schon angeboten wird und auch besser funktioniert?

0
Gastnr007  22.06.2018, 22:29
@FireEraser

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.

0
FireEraser  22.06.2018, 22:35
@Gastnr007

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.

0
Gastnr007  22.06.2018, 22:39
@FireEraser

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)

0
FireEraser  22.06.2018, 22:53
@Gastnr007
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

0