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

Chronometer auslesen

Dieses Thema im Forum "Android App Entwicklung" wurde erstellt von paulinchen, 21.03.2011.

  1. paulinchen, 21.03.2011 #1
    paulinchen

    paulinchen Threadstarter Junior Mitglied

    Beiträge:
    25
    Erhaltene Danke:
    0
    Registriert seit:
    13.12.2010
    Hallo,

    ich versuche gerade eine Stoppuhr-App zu schreiben, die neben der laufenden Zeit zusätzlich noch eine andere Einheit zählt.

    Mit dem Chronometer schaff ich es auf jeden Fall auch schon die Zeit laufen, stoppen und zu reseten.
    Allerdings muss ich um die zweite "Uhr" laufen zu lassen, den Chronometer auslesen,die Sekunden immer wieder mit einem Faktor multiplizieren und dann einen zweiten Timecode in einer TextView erstellen. Oder?

    Da scheitere ich allerdings grandios mit meinen Anfängerkenntnissen.

    Code:
    public void showElapsedTime() {
            long elapsedMillis = SystemClock.elapsedRealtime() - mChronometer.getBase();            
               Toast.makeText(MatClockActivity.this, "Elapsed milliseconds: " + elapsedMillis, 
                       Toast.LENGTH_SHORT).show();
           }
          
           View.OnClickListener mStartListener = new OnClickListener() {
               public void onClick(View v) {
    
                int stoppedMilliseconds = 0;
    
                   String chronoText = mChronometer.getText().toString();
                   String array[] = chronoText.split(":");
                   if (array.length == 2) {
                     stoppedMilliseconds = Integer.parseInt(array[0]) * 60 * 1000
                         + Integer.parseInt(array[1]) * 1000;
                   } else if (array.length == 3) {
                     stoppedMilliseconds = Integer.parseInt(array[0]) * 60 * 60 * 1000 
                         + Integer.parseInt(array[1]) * 60 * 1000
                         + Integer.parseInt(array[2]) * 1000;
                   }
    
                   mChronometer.setBase(SystemClock.elapsedRealtime() - stoppedMilliseconds);
                   mChronometer.start();
                   showElapsedTime();
                   buttonStart.setVisibility(View.GONE);
                   buttonStop.setVisibility(View.VISIBLE);
    
               }
           };
    
           View.OnClickListener mStopListener = new OnClickListener() {
               public void onClick(View v) {
                   mChronometer.stop();
                   showElapsedTime();
                   buttonStop.setVisibility(View.GONE);
                   buttonStart.setVisibility(View.VISIBLE);
               }
           };
    Hier soweit mal meine Anfänge.

    Vielleicht kann mir ja jemand auf die Sprünge helfen.
    Das einzige, was ich dazu im Netz gefunden habe, ist diese App

    Updating the UI from a Timer | Android Developers

    Allerdings verstehe ich nicht ganz wie das funktionieren soll.
     
  2. paulinchen, 22.03.2011 #2
    paulinchen

    paulinchen Threadstarter Junior Mitglied

    Beiträge:
    25
    Erhaltene Danke:
    0
    Registriert seit:
    13.12.2010
    Ich hab mich noch mal ein wenig mit dem Problem auseinander gesetzt und festgestellt, dass ich den Wald vor lauter Bäumen nicht gesehen hab :blink:

    Der zweite hat ja in diesem Sinne eigentlich nix mit dem Chronometer zu tun, ich brauche ja nur eine Schleife, die den TextView im Sekunden Intervall updatet.

    Das habe ich nun mal rudimentär versucht zu bauen, allerdings hackt es da irgendwo, weil das TextView nicht verändert wird, aber ich weiß nicht warum.

    Hier einmal die Schlaufe
    Code:
         View.OnClickListener mStartListener = new OnClickListener() {
               public void onClick(View v) {
    
              
    
                   mChronometer.setBase(SystemClock.elapsedRealtime() - stoppedMilliseconds);
                   mChronometer.start();
                   
                   handler = new Handler();
                   handler.postDelayed(runnable, 100);
    
                   runnable = new Runnable() {
                       @Override
                       public void run() {
                          /* do what you need to do */
                           showLength();
                          /* and here comes the "trick" */
                          handler.postDelayed(this, 100);
                       }
                    };
    
     
                   
                   buttonStart.setVisibility(View.GONE);
                   buttonStop.setVisibility(View.VISIBLE);
    
               }
           };
    
    Code:
    und die showLength Methode
    
           public void showLength() {
               TextView TV = (TextView) findViewById (R.id.timeLabel);
               length = Double.parseDouble(TV.getText().toString());
               length = length + 1;
                   TV.setText(Double.toString(length));  
           }
    Vielleicht hat ja jemand Zeit, sich das mal anzuschauen ...
     
  3. reddox, 22.03.2011 #3
    reddox

    reddox Neuer Benutzer

    Beiträge:
    22
    Erhaltene Danke:
    5
    Registriert seit:
    11.03.2011
    Vielleicht hilft es
    Code:
    handler.postDelayed(this, 100);
    mit
    Code:
    handler.postDelayed(runnable, 100);
    zu ersetzen - zumindest nen Versuch wert.
    Oder aber es liegt daran, dass der Handler seinen Gueltigkeitsbereich ausserhalb des OnClick-Callbacks verliert - den kann man ja mal versuchen etwas globaler zu definieren (als private Attribut der Activity zB).

    Noch eine Anmerkung nebenbei: Eine genaue Zeitaufloesung wirst du so nicht erreichen - Handler.postDelayed(xx, 100) heisst nicht, dass aller 100ms die Funktion erneut aufgerufen wird, sondern das etwa aller 100ms die Funktion neu aufgerufen wird.

    Edit: wahrscheinlich muss die runnable auch etwas globaler definiert werden und der OnClick-Handler dient dann nur als Trigger
     
    Zuletzt bearbeitet: 23.03.2011
  4. DieGoldeneMitte, 23.03.2011 #4
    DieGoldeneMitte

    DieGoldeneMitte Android-Lexikon

    Beiträge:
    1,230
    Erhaltene Danke:
    256
    Registriert seit:
    05.02.2010
    Phone:
    Nexus 5X
    Tablet:
    Nexus 7 (2013)
    Man sollte das runnable vor dem (ersten) postDelayed zuweisen. :)

    runnable ist vor der Ausführung der Zuweisung null, d.h. der erste postDelayed außerhalb vom runnable bekommt kein Objekt zugewiesen. Was man beim postDelayed im runnable macht (this oder runnable) ist vermutlich egal, es macht aber einen Unterschied, wenn der Inhalt von runnable sich ändert.
     
    Zuletzt bearbeitet: 23.03.2011
    paulinchen bedankt sich.
  5. paulinchen, 23.03.2011 #5
    paulinchen

    paulinchen Threadstarter Junior Mitglied

    Beiträge:
    25
    Erhaltene Danke:
    0
    Registriert seit:
    13.12.2010
    Was so eine Zeile an der falschen Stelle manchmal ausmachen kann...

    Vielen Dank!!!

    Wie reddox schon angemerkt hat, ist der Timer allerdings nicht super präzise.
    Gibt es die Möglichkeit das Zählwerk etwas genauer zu machen?
     
  6. reddox, 23.03.2011 #6
    reddox

    reddox Neuer Benutzer

    Beiträge:
    22
    Erhaltene Danke:
    5
    Registriert seit:
    11.03.2011
    Genauer kannst du die Funktion nicht machen.

    Du kannst aber in eine Variabe den Wert von System.currentTimeMillis() speichern und dann in der Updatefunktion (bzw showLength) die Differenz der Variable zu System.currentTimeMillis() berechnen und ausgeben - dass ist dann wirklich genau (alternativ geht natuerlich auch jeder andere Zeitwert zB SystemClock.elapsedRealtime() - was vllt sogar geschickter ist, denn falls zwischendurch die Zeit oder das Datum modifiziert wird, wird es fehlerhaft wenn man currentTimeMillis() nutzt)
     
    paulinchen bedankt sich.
  7. paulinchen, 25.03.2011 #7
    paulinchen

    paulinchen Threadstarter Junior Mitglied

    Beiträge:
    25
    Erhaltene Danke:
    0
    Registriert seit:
    13.12.2010
    Danke! Läuft jetzt alles wie am Schnürchen und der Timer ist sogar recht präzise.
    Allerdings ist mir heute aufgefallen, dass die Uhr stehen bleibt, wenn man das Telefon querstellt.

    Weiß da jemand Rat?
     
  8. reddox, 26.03.2011 #8
    reddox

    reddox Neuer Benutzer

    Beiträge:
    22
    Erhaltene Danke:
    5
    Registriert seit:
    11.03.2011
    Beim drehen des Phones (und dem damit verbundenem Wechsel von Landscape auf Portrait und andersherum) wird jedes mal die onCreate-Function der Activity neu aufgerufen. Vermutlich ist dort der Fehler zu suchen.

    Alternativ kann man im Manifest das automatische drehen deaktivieren (innerhalb des Activity Tags android:screenOrientation="portrait" einfügen)
     

Diese Seite empfehlen