Probleme mit Timer

  • 7 Antworten
  • Neuster Beitrag
Fonsi

Fonsi

Fortgeschrittenes Mitglied
Threadstarter
Hi Leute,

ich will mit Hilfe dieses Tutorials: Updating the UI from a Timer | Android Developers
einen Timer in meine App integrieren. Der Timer soll bei "00:00" anfangen die Sekunden zu zählen. Ich hab nen Button, der den Timer startet, allerdings zeigt mein TextView im Emulator dann dauerhaft "-214134234:0-30" an.

In der Runnable-Prozedur aus dem Tutorial hab ich eigentlich nur die Ausgabe (lblTimer) geändert:

Code:
private Runnable mUpdateTimeTask = new Runnable() {
           public void run() {
               final long start = mStartTime;
               long millis = SystemClock.uptimeMillis() - start;
               int seconds = (int) (millis / 1000);
               int minutes = seconds / 60;
               seconds     = seconds % 60;

               if (seconds < 10) {
                   lblTimer.setText("" + minutes + ":0" + seconds);
               } else {
                   lblTimer.setText("" + minutes + ":" + seconds);            
               }
             
               mHandler.postAtTime(this,
                       start + (((minutes * 60) + seconds + 1) * 1000));
           }
        };
Aufgerufen wird die Prozedur durch den OnClickListener:
Code:
    private OnClickListener mStartListener = new OnClickListener() {
           public void onClick(View v) {
               if (mStartTime == 0L) {
                    mStartTime = System.currentTimeMillis();
                    mHandler.removeCallbacks(mUpdateTimeTask);
                    mHandler.postDelayed(mUpdateTimeTask, 100);
               }
           }
        };
Habt ihr Tipps oder Ideen, warum der Timer nicht läuft bzw. falsche Werte liefert?
 
Zuletzt bearbeitet:
U

Unicate

Erfahrenes Mitglied
UI aktualisieren lassen!

Muss im UI Thread passieren, deswegen einen Handler verwenden.

invalidate() der Activity aufrufen
 
N

Neeldarax

Fortgeschrittenes Mitglied
Hallo Fonsi,

und das zweite Problem sind deine negativen Zahlen.


System.currentTimeMillis() is the standard "wall" clock (time and date) expressing milliseconds since the epoch.
uptimeMillis() is counted in milliseconds since the system was booted.
Du weichst vom Beispiel ab. Wenn du eine einfache Start-Stop-Uhr machen willst, dann musst du bei einer Methode bleiben, die dir die aktuelle Zeit gibt.

Weiter als negativen Zahlen und invalidate habe ich nicht geguckt. Probier das aus, wenn noch Unklarheiten aufkommen... :)

regards


Quelle der Zitaten: http://developer.android.com/reference/android/os/SystemClock.html
 
Fonsi

Fonsi

Fortgeschrittenes Mitglied
Threadstarter
Unicate schrieb:
UI aktualisieren lassen!

Muss im UI Thread passieren, deswegen einen Handler verwenden.

invalidate() der Activity aufrufen
Wo rufe ich das invalidate() denn dann genau auf? In der Runnable-Prozedur gehts ja nicht, weil das kein UI-Thread ist.
 
Zuletzt bearbeitet:
U

Unicate

Erfahrenes Mitglied
Als Member anlegen:
PHP:
    private Handler notifyHandler = new Handler() 
    { 
        @Override 
        public void handleMessage(Message msg) { 
            nameDeinerView.invalidate();
        }
    };
Und dann im Thread sowas hier aufrufen wenn aktualisiert werden soll:

PHP:
notifyHandler.sendEmptyMessage(0)
Ist natürlich stark vereinfacht, hier sollte man evtl. noch im handler abfragen was in msg.what drin steht und ggf. switchen
 
Zuletzt bearbeitet:
Fonsi

Fonsi

Fortgeschrittenes Mitglied
Threadstarter
Danke, das hab ich jetzt mal hinzugefügt. Allerdings scheint es
Code:
CounterActivity.this.invalidate();
nicht zu geben. Muss hier das TextView rein oder die gesamte Activity? Die Activity heißt CounterActivity.


Was ich auch noch nicht so ganz verstehe aus dem Beispiel ist das hier:
Code:
mHandler.postAtTime(this,start + (((minutes * 60) + seconds + 1) * 1000));
.

Beim Zähler soll die Prozedur doch jede Sekunde aufgerufen werden. Wenn ich aber
Code:
mHandler.postAtTime(this,1000));
aufrufe, hängt sich die Anwendung auf.
 
U

Unicate

Erfahrenes Mitglied
Tschuldige natürlich muss da die View rein und nicht die ganze Activity
 
Fonsi

Fonsi

Fortgeschrittenes Mitglied
Threadstarter
Shame on me! Ich hab ganze 6 Stunden gebraucht, um herauszufinden, dass es für mein Vorhaben das Chronometer gibt :cursing:. Man sollte sich vor der Entwicklung der ersten App die Controls genauer anschauen :blushing:

Trotzdem danke an alle, die geholfen haben! Es läuft nun :thumbup:
 
Oben Unten