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:
     
Die Seite wird geladen...
Ähnliche Themen Forum Datum
[ERLEDIGT] Kleine Probleme mit einer App Android App Entwicklung 14.06.2017
[OFFEN] Probleme mit Action Floating Button Android App Entwicklung 27.05.2017
[OFFEN] WebView Probleme Android App Entwicklung 19.05.2017
[ERLEDIGT] Probleme mit Wear Modul Android App Entwicklung 01.05.2017
[OFFEN] Probleme mit SearchView in ArrayAdapter Android App Entwicklung 28.04.2017
Probleme beim Encoding einer Textdatei von Windows Android App Entwicklung 25.01.2017
Probleme mit NFC File Transfer Android App Entwicklung 21.01.2017
Timer + setText funktioniert nicht Android App Entwicklung 20.01.2017
Timer und setText funktionieren nicht in Kombination Android App Entwicklung 20.01.2017
Layout-Probleme auf verschiedenen Geräten Android App Entwicklung 19.01.2017