1. Nimm jetzt an unserem AGM - Gewinnspiel teil - Informationen zum M1, A2 und A8 findest Du hier, hier und hier!
  1. Fonsi, 19.09.2011 #1
    Fonsi

    Fonsi Threadstarter Erfahrener Benutzer

    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

    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

    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

    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

    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

    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

    Tschuldige natürlich muss da die View rein und nicht die ganze Activity
     
  8. Fonsi, 19.09.2011 #8
    Fonsi

    Fonsi Threadstarter Erfahrener Benutzer

    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: