1. Nimm jetzt an unserem Uhans - 3. ADVENT - Gewinnspiel teil - Alle Informationen findest Du hier!

Probleme mit Timer

Dieses Thema im Forum "Android App Entwicklung" wurde erstellt von Fonsi, 19.09.2011.

  1. Fonsi, 19.09.2011 #1
    Fonsi

    Fonsi Threadstarter Erfahrener Benutzer

    Beiträge:
    178
    Erhaltene Danke:
    15
    Registriert seit:
    08.07.2011
    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: 19.09.2011
  2. Unicate, 19.09.2011 #2
    Unicate

    Unicate Android-Experte

    Beiträge:
    473
    Erhaltene Danke:
    57
    Registriert seit:
    09.08.2010
    UI aktualisieren lassen!

    Muss im UI Thread passieren, deswegen einen Handler verwenden.

    invalidate() der Activity aufrufen
     
  3. Neeldarax, 19.09.2011 #3
    Neeldarax

    Neeldarax Erfahrener Benutzer

    Beiträge:
    170
    Erhaltene Danke:
    31
    Registriert seit:
    07.12.2010
    Hallo Fonsi,

    und das zweite Problem sind deine negativen Zahlen.


    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
     
  4. Fonsi, 19.09.2011 #4
    Fonsi

    Fonsi Threadstarter Erfahrener Benutzer

    Beiträge:
    178
    Erhaltene Danke:
    15
    Registriert seit:
    08.07.2011
    Wo rufe ich das invalidate() denn dann genau auf? In der Runnable-Prozedur gehts ja nicht, weil das kein UI-Thread ist.
     
    Zuletzt bearbeitet: 19.09.2011
  5. Unicate, 19.09.2011 #5
    Unicate

    Unicate Android-Experte

    Beiträge:
    473
    Erhaltene Danke:
    57
    Registriert seit:
    09.08.2010
    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: 19.09.2011
  6. Fonsi, 19.09.2011 #6
    Fonsi

    Fonsi Threadstarter Erfahrener Benutzer

    Beiträge:
    178
    Erhaltene Danke:
    15
    Registriert seit:
    08.07.2011
    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.
     
  7. Unicate, 19.09.2011 #7
    Unicate

    Unicate Android-Experte

    Beiträge:
    473
    Erhaltene Danke:
    57
    Registriert seit:
    09.08.2010
    Tschuldige natürlich muss da die View rein und nicht die ganze Activity
     
  8. Fonsi, 19.09.2011 #8
    Fonsi

    Fonsi Threadstarter Erfahrener Benutzer

    Beiträge:
    178
    Erhaltene Danke:
    15
    Registriert seit:
    08.07.2011
    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:
     

Diese Seite empfehlen