Android abgelaufene Zeit aus Chronometer zum Rechnen nutzen

Julius99

Julius99

Mitglied
Hallo zusammen,

ich habe eine Stoppuhr in Form eines Chronometers und eine Strecke.
Nun möchte ich die abgelaufene zeit durch meine zurückgelegte Strecke teilen um die min/km zu erhalten.

Ich habe versucht die abgelaufene Zeit long in eine float umzuwandeln um diese dann teilen zu können.
Dies funktioniert anscheinend nicht.
Falls jemand weiter weiß bitte melden, vielen Dank!
Java:
  public void onClick(View view)
    {
        //Start geklickt:
        if(view.getId()==R.id.start)
        {
            bstart.setEnabled(false);
            bstop.setEnabled(true);
            //Schritte
            startService(new Intent(this, SchrittzaehlerService.class));
            SchrittzaehlerService.ereignisHandler = ereignisHandler;
            //Zeit
            chronometer.setBase(SystemClock.elapsedRealtime() + abgelaufeneZeit);
            chronometer.start();
            //Weg
            startService(new Intent(this,WegAufzeichnungsService.class));
            WegAufzeichnungsService.updateHandler = handler;
        }
Die Berechnung:
Berechnung min/km:
public float geschw;
public float rundWeg;
long abgelaufeneZeit;

geschw = (float)(SystemClock.elapsedRealtime() + abgelaufeneZeit) / rundWeg;
 
mrBrown

mrBrown

Super-Moderator
Mitarbeiter
ich habe eine Stoppuhr in Form eines Chronometers und eine Strecke.
Chronometer dürfte das falsche dafür sein, das ist doch nur für die GUI da und nicht zum Zeit messen?

Das wirst du selbst machen müssen, zB bei start und Ende den jeweiligen Zeitpunkt speichern und die Differenz berechnen.

Berechnung min/km:
public float geschw;
public float rundWeg;
long abgelaufeneZeit;

geschw = (float)(SystemClock.elapsedRealtime() + abgelaufeneZeit) / rundWeg;
SystemClock.elapsedRealtime gibt dir einfach nur einen Zeitpunkt zurück, der erstmal alleine nichts aussagt (zumindest nichts, mit dem du was anfangen könntest). Zusätzlich addierst du abgelaufeneZeit drauf (was in dem Beispiel 0 wäre), bekommt also einen eher zufälligen Wert, und versuchst mit diesem was zu berechnen – das geht aus offensichtlichen Gründen schief :)
 
Julius99

Julius99

Mitglied
klappt nicht ist meistens eine sehr unbrauchbare Fehlerbeschreibung...
Sorry, wusste nicht wie ich es besser ausdrücken kann.
Chronometer dürfte das falsche dafür sein, das ist doch nur für die GUI da und nicht zum Zeit messen?

Das wirst du selbst machen müssen, zB bei start und Ende den jeweiligen Zeitpunkt speichern und die Differenz berechnen.


SystemClock.elapsedRealtime gibt dir einfach nur einen Zeitpunkt zurück, der erstmal alleine nichts aussagt (zumindest nichts, mit dem du was anfangen könntest). Zusätzlich addierst du abgelaufeneZeit drauf (was in dem Beispiel 0 wäre), bekommt also einen eher zufälligen Wert, und versuchst mit diesem was zu berechnen – das geht aus offensichtlichen Gründen schief :)
Okay, danke! Ich werde mal schauen was sich machen lässt.
Bin das erste mal eine App am programmieren und beschäftige mich noch nicht lange damit, deshalb sorry für die möglicherweise "dummen" Fragen! :)
 
Julius99

Julius99

Mitglied
Das wirst du selbst machen müssen, zB bei start und Ende den jeweiligen Zeitpunkt speichern und die Differenz berechnen.
Genau das habe ich jetzt mal versucht.
Ich habe beim Drücken des Start-Buttons die aktuelle Zeit eingelesen und in "startZeit" gespeichert.
Das gleiche habe ich beim Drücken des Stop-Buttons gemacht, allerdings habe ich die Zeit in "aktZeit" gespeichert.
Anschließend habe ich die Differnz gebildet, sowie in Minuten umgerechnet.
Dann habe ich wie folgt die min/km berechnet, allerdings zeigt es mir immer 0 an.

Berechnung min/km:
            geschw = (float)diffZeit / rundWeg;
            rundGeschw = (float)(((int)(geschw*10))/10.0);


Zur Übersicht:
Java:
//Geschwindigkeit
private TextView vGesch;
public float geschw;
public float rundGeschw;
long startZeit;
long aktZeit;
long diffZeit;

public void onClick(View view)
    {
        //Start geklickt:
        if(view.getId()==R.id.start)
        {
            bstart.setEnabled(false);
            bstop.setEnabled(true);
            //Schritte
            startService(new Intent(this, SchrittzaehlerService.class));
            SchrittzaehlerService.ereignisHandler = ereignisHandler;
            //Zeit
            chronometer.setBase(SystemClock.elapsedRealtime() + abgelaufeneZeit);
            chronometer.start();
            //Weg
            startService(new Intent(this,WegAufzeichnungsService.class));
            WegAufzeichnungsService.updateHandler = handler;
            //Geschwindigkeit
            startZeit = System.currentTimeMillis();
        }
        //Stop geklickt:
        if(view.getId()==R.id.stop)
        {
            bstop.setEnabled(false);
            bstart.setEnabled(true);
            //Schritte
            stopService(new Intent(this, SchrittzaehlerService.class));
            //Zeit
            abgelaufeneZeit = chronometer.getBase() - SystemClock.elapsedRealtime();
            chronometer.stop();
            //Weg
            stopService(new Intent(this,WegAufzeichnungsService.class));
            //Geschwindigkeit
            aktZeit = System.currentTimeMillis();
            diffZeit = (aktZeit - startZeit) / (1000 * 60);
            geschw = (float)diffZeit / rundWeg;
            rundGeschw = (float)(((int)(geschw*10))/10.0);
            vGesch.setText(Float.toString(rundGeschw));
        }
 
mrBrown

mrBrown

Super-Moderator
Mitarbeiter
Lass dir einfach mal die Zwischenergebnisse ausgeben, und nicht nur das Endergebnis der Rechnung.
 
Julius99

Julius99

Mitglied
Lass dir einfach mal die Zwischenergebnisse ausgeben, und nicht nur das Endergebnis der Rechnung.
Hallo @mrBrown,
Ich habe seit gestern noch weiter probiert es hinzubekommen.
Ich dachte erst ich kann System.currentTimeMillis() verwenden, da ich ja eine Differenz bilde und dann eigentlich egal sein sollte, ab wann die Zeit läuft. (Mir ist bewusst, dass ich die Zeit in Millisekunden relativ zum 1.1.1970 in die Variablen speichere.)

Meine Überlegung war:
Ich drücke Button Start: Die zum Zeitpunkt "Start gedrückt" abgelaufene Zeit in Millisekunden relativ zum 1.1.1970 wird in startZeit gespeichert.
Ich drücke Button Stop: Es passiert das gleiche nur zum Zeitpunkt "Stop gedrückt" + es wird die Differenz der beiden Zeiten gebildet.

Mein Problem:
Die Differenz ist anscheinend immer = 0. Sprich die abgelaufene Zeit zum Zeitpunkt "Start gedrückt" ist gleich der zum Zeitpunkt " Stop gedrückt".
Warum ist das so?
PS: Die Variablen startZeit und aktZeit werden beschrieben. Ich habe mir beide einem ausgeben lassen.

Hier mein Code:
Java:
   public void onClick(View view)
    {
        //Start geklickt:
        if(view.getId()==R.id.start)
        {
            bstart.setEnabled(false);
            bstop.setEnabled(true);
            //Schritte
            startService(new Intent(this, SchrittzaehlerService.class));
            SchrittzaehlerService.ereignisHandler = ereignisHandler;
            //Zeit
            chronometer.setBase(SystemClock.elapsedRealtime() + abgelaufeneZeit);
            chronometer.start();
            //Weg
            startService(new Intent(this,WegAufzeichnungsService.class));
            WegAufzeichnungsService.updateHandler = handler;
            //Geschwindigkeit
            startZeit = System.currentTimeMillis();
        }
        //Stop geklickt:
        if(view.getId()==R.id.stop)
        {
            bstop.setEnabled(false);
            bstart.setEnabled(true);
            //Schritte
            stopService(new Intent(this, SchrittzaehlerService.class));
            //Zeit
            abgelaufeneZeit = chronometer.getBase() - SystemClock.elapsedRealtime();
            chronometer.stop();
            //Weg
            stopService(new Intent(this,WegAufzeichnungsService.class));
            //Geschwindigkeit
            aktZeit = System.currentTimeMillis();
            diffZeit = TimeUnit.MILLISECONDS.toMinutes(aktZeit - startZeit);
            vGesch.setText(Float.toString(diffZeit));
        }
 
Thallius

Thallius

Top Contributor
Lass dir doch einfach mal die Zeiten alle drei einzeln ausgeben. Wie Browny schon sagte. Dann weiß man mehr
 
F

fhoffmann

Top Contributor
Die Methode TimeUnit.MILLISECONDS.toMinutes(aktZeit - startZeit); schneidet ab. Wenn also weniger als eine Minute vergangen ist, wird 0 zurückgegeben.
 
Julius99

Julius99

Mitglied
Lass dir doch einfach mal die Zeiten alle drei einzeln ausgeben. Wie Browny schon sagte. Dann weiß man mehr
Mir ist keine andere Möglichkeit als die unten dargestellte bekannt und hierbei wird mir im Logcat komischerweise nichts angezeigt.
Java:
        Log.d("Hallo","Value:" + Long.toString(startZeit));
        Log.d("Hallo", "Value:" + Long.toString(aktZeit));
        Log.d("Hallo", "Value" + Long.toString(diffZeit));

1605610479911.png
 
Julius99

Julius99

Mitglied
Die Methode TimeUnit.MILLISECONDS.toMinutes(aktZeit - startZeit); schneidet ab. Wenn also weniger als eine Minute vergangen ist, wird 0 zurückgegeben.
Das macht Sinn, ich habe es länger als eine Minute laufen lassen und dann gibt es 1.0 aus. Danke!
Gibt es eine Möglichkeit dies zu verhindern?
 
Thallius

Thallius

Top Contributor
Wenn du ganz einfach System.out.print nimmst, wird das dann nicht im Terminal angezeigt bei Android Apps?
 
Thallius

Thallius

Top Contributor
Das macht Sinn, ich habe es länger als eine Minute laufen lassen und dann gibt es 1.0 aus. Danke!
Gibt es eine Möglichkeit dies zu verhindern?

Ja, warum läßt du das nicht einfach weg. Die Subtraktion gibt dir Millisekunden. Also teilst du einfach das Ergebnis durch 1000 wenn du Sekunden willst oder du benutzt sogar Millisekunden. Ist ja die Frage was du am ende haben willst. Aber formatieren kannst du immer noch bei der Anzeige. Intern kannst du mit allem rechnen was du willst
 
Julius99

Julius99

Mitglied
Ja, warum läßt du das nicht einfach weg. Die Subtraktion gibt dir Millisekunden. Also teilst du einfach das Ergebnis durch 1000 wenn du Sekunden willst oder du benutzt sogar Millisekunden. Ist ja die Frage was du am ende haben willst. Aber formatieren kannst du immer noch bei der Anzeige. Intern kannst du mit allem rechnen was du willst
Das hatte ich auch schon ausprobiert.
Ich möchte aber Minuten angezeigt bekommen.
Wenn ich jetzt hingehe und es wie folgt schreibe dann funktioniert es und mir werden die Sekunden angezeigt:
Java:
diffZeit = (aktZeit - startZeit) / 1000;

Da ich aber die Minuten möchte schreibe ich es wie folgt:
Java:
diffZeit = (aktZeit - startZeit) / (1000 * 60);
Und das kommt dann wieder aufs selbe raus wie @fhoffmann angesprochen hatte. Es schneidet ab.
 
Thallius

Thallius

Top Contributor
Immer noch nicht klar was du willst. Was sollen 15s sein? 0 Minuten? Was sollen 45s sein? 1min?
 
Julius99

Julius99

Mitglied
Ich möchte im nächsten Schritt min/km ausrechnen.
Ich benötige die Minuten mit einer Nachkommastelle. Sprich 90sek = 1,5min
 
Julius99

Julius99

Mitglied
Es läuft, vielen Dank für die Hilfen!

Java:
//Weg
private TextView vStrecke;
private static final int REQUESTCODE_PERMISSIONS = 222;
private WegHandler handler = new WegHandler();
public float currentDistanz;
public float rundWeg;
//Geschwindigkeit
private TextView vGesch;
public float geschw;
public float rundGeschw;
long startZeit;
long aktZeit;
long diffZeit;


//Berechnung der zurückgelegten Distanz
public void berechneStrecke()
    {
        currentDistanz = 0;
        List<Location> weg = WegAufzeichnungsService.weg;
        if(weg.size()>1)
        {
            for(int i=1; i<weg.size(); i++)
            {
                currentDistanz += ((weg.get(i-1).distanceTo(weg.get(i))) / 1000);
            }
        }
        rundWeg = (float)(((int)(currentDistanz*10))/10.0);
        vStrecke.setText(Float.toString(rundWeg));
    }

public void onClick(View view)
    {
        //Start geklickt:
        if(view.getId()==R.id.start)
        {
            bstart.setEnabled(false);
            bstop.setEnabled(true);
            //Schritte
            startService(new Intent(this, SchrittzaehlerService.class));
            SchrittzaehlerService.ereignisHandler = ereignisHandler;
            //Zeit
            chronometer.setBase(SystemClock.elapsedRealtime() + abgelaufeneZeit);
            chronometer.start();
            //Weg
            startService(new Intent(this,WegAufzeichnungsService.class));
            WegAufzeichnungsService.updateHandler = handler;
            //Geschwindigkeit
            startZeit = System.currentTimeMillis();
        }
        //Stop geklickt:
        if(view.getId()==R.id.stop)
        {
            bstop.setEnabled(false);
            bstart.setEnabled(true);
            //Schritte
            stopService(new Intent(this, SchrittzaehlerService.class));
            //Zeit
            abgelaufeneZeit = chronometer.getBase() - SystemClock.elapsedRealtime();
            chronometer.stop();
            //Weg
            stopService(new Intent(this,WegAufzeichnungsService.class));
            //Geschwindigkeit
            aktZeit = System.currentTimeMillis();
            diffZeit += (aktZeit - startZeit);
            if (rundWeg != 0){
                geschw = (float)(diffZeit/ (1000.0 *60)) / rundWeg;
                rundGeschw = (float)(((int)(geschw*100))/100.0);
                vGesch.setText(Float.toString(rundGeschw));
            }
            else{
                vGesch.setText(Double.toString(0.00));
            }
        }
 

Ähnliche Java Themen

Anzeige

Neue Themen


Oben