Chronometer auslesen

P

paulinchen

Gast
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.
 
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 ...
 
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:
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:
  • Danke
Reaktionen: paulinchen
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?
 
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)
 
  • Danke
Reaktionen: paulinchen
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?
 
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)
 

Ähnliche Themen

H
Antworten
2
Aufrufe
1.307
Hcman
H
M
  • maksimilian
Antworten
8
Aufrufe
1.267
jogimuc
J
V
Antworten
2
Aufrufe
926
Vultan
V
Zurück
Oben Unten