Periodisches Ereignis

T

Turbo1976

Neues Mitglied
0
Hallo an euch,

ich würde gerne, sobald eine App gestartet wird, ein Ereignis alle 10 Sekunden ausführen lassen.
Beispiel: Eine Uhr fängt bei 100 Sekunden an zu "ticken" und alle 10 Sekunden soll dann der neue Wert (also 90, 80, 70, ...) angezeigt werden.

Das müsste ja über die OnCreate erledigt werden. Aber wie genau? Hat jemand eine Idee?

Habe das über diesen Weg mal versucht:
Code:
 Runnable helloRunnable = new Runnable() {
    public void run() {
        System.out.println("Hello world");
    }
};

ScheduledExecutorService executor = Executors.newScheduledThreadPool(1);
executor.scheduleAtFixedRate(helloRunnable, 10, 10, TimeUnit.SECONDS);
Funktioniert leider jedoch nicht. Wenn ich die Werte in ein TextView scheiben möchte (in der public void run()), dann passiert nichts, bis ich das Display scrolle. Dann schreibt er einen Teil des Werts in den TextView, danach passiert gar nichts mehr :ohmy:
 
Zuletzt bearbeitet:
Stichwort

Timer
Actionlistener

oder

System.currentTimeMillis();

ich hab grad eh langeweile: hier ein timing event (quasi milli)sekunden-genau:

Code:
long oldTime=System.currentTimeMillis();
float delTime=0;
float countDown=100;
run(){
while(countDown>=0)//vllt noch eine zweite abbruchbedingung die du von aussen steuern kannst um die schleife abzubrechen
{
    deltime=(float)(System.currentTimeMillis()-oldTime);//dieser cast ist okay

    if(deltime>=1000)
    {
        oldTime=System.currentTimeMillis();
        countDown-=delTime/1000f;//rechnung: millisekunden genau
        if(countDown<=0)
            System.out.println("BOOOOOOOOM");//booom countdown abgelaufen-alle tot
        else
            System.out.println("Countdown:  "+(int)countDown+" sek")//ausgabe:"Countdown: 89 sek" z.B./ausgabe: sekundengenau
    }
    else try
           {
                this.sleep(250);
           }
           catch(InterruptedException e)
           {
                 //Weltkrieg einleiten
           }
}
}
 
Zuletzt bearbeitet:
Hier ein Beispiel:

Code:
 public class TimerDemo {    public static void main(String[] args) {       // creating timer task, timer       TimerTask tasknew = new TimerScheduleFixedRateDelay();       Timer timer = new Timer();              // scheduling the task at fixed rate delay       timer.scheduleAtFixedRate(tasknew,500,1000);          }    // this method performs the task    public void run() {       System.out.println("working at fixed rate delay");          }     }
java.util.Timer.scheduleAtFixedRate(TimerTask task,long delay,long period) Method Example
 
Man kann aus nebenläufigen Threads nicht die UI (wie Inhalte von TextView) verändern.
Dazu muss man den Code vom UI Thread ausführen lassen.
Das kann man mit einem Handler machen oder per

Code:
getActivity().runOnUiThread( new Runnable() {
  public void run() {
     ... TextView ändern ...
  }
});
 
Jaiels Beispielcode würde ich als "bad practice" einsortieren. Durch das aktive Warten ohne Pause wird ein Prozessor-Kern während des Countdowns zu 100% ausgelastet und das dürfte sich gut am Akku und sonstiger Reaktionsfreudigkeit des Systems bemerkbar machen. Besser wäre es, wenn man kurze Pausen mittels Thread.Sleep() einbauen würde. Für kurze(!) Wartepausen mag das ok sein, aber lieber auf die anderen genannten Möglichkeiten ausweichen.

EDIT: Das Code-Beispiel wurde angepasst. Damit ist dieser Kommentar teilweise obsolete.
 
Zuletzt bearbeitet:
thread.sleep() gilt als unsicher und auch als schlechte praktik und man muss es in einem try catch block platzieren.

ich selbst würde einen Timer verwenden

aber er kann auch ruhig einen Sleep einfügen wenn er will.
Ausserdem lastet das nciht wirklich die CPU aus lol. und es werden auch keine anderen threads dadurch benachteiligt da die cpu ihr eigene verwaltungspolitik fährt
 
Jaiel schrieb:
Ausserdem lastet das nciht wirklich die CPU aus

Eine Threadschleife ohne sleep() (bzw. einem anderen "blocking Event") lastet die CPU sehr wohl aus.
Und die Batterie erst recht.
 
na gut so soll er doch einen sleep benutzen
ich änder das in meinem beispiel damit es nciht emhr "bad practice" ist
 
Habe das Problem gelöst, vielen Dank für eure Antworten!

Die Lösung von missspelled hat mich weiter gebracht. In den TextView wollte ich nur die Kontrollwerte schreiben.
 

Ähnliche Themen

M
Antworten
3
Aufrufe
705
swa00
swa00
M
Antworten
3
Aufrufe
783
Andy
Andy
keinbrain
Antworten
4
Aufrufe
881
StefMa
StefMa
Zurück
Oben Unten