Android abgelaufene Zeit aus Chronometer zum Rechnen nutzen

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!
[CODE lang="java" highlight="11-13"] 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;
}[/CODE]
Die Berechnung:
[CODE lang="java" title="Berechnung min/km"]public float geschw;
public float rundWeg;
long abgelaufeneZeit;

geschw = (float)(SystemClock.elapsedRealtime() + abgelaufeneZeit) / rundWeg;[/CODE]
 

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.

[CODE lang="java" title="Berechnung min/km"]public float geschw;
public float rundWeg;
long abgelaufeneZeit;

geschw = (float)(SystemClock.elapsedRealtime() + abgelaufeneZeit) / rundWeg;[/CODE]
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

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

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.

[CODE lang="java" title="Berechnung min/km"] geschw = (float)diffZeit / rundWeg;
rundGeschw = (float)(((int)(geschw*10))/10.0);[/CODE]


Zur Übersicht:
[CODE lang="java" highlight="26, 41-45"]//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));
}[/CODE]
 

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:
[CODE lang="java" highlight="18, 33-35"] 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));
}[/CODE]
 

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

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
 

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

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.
 

Julius99

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

[CODE lang="java" highlight="18, 33-42"]//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));
}
}[/CODE]
 

Ähnliche Java Themen

Neue Themen


Oben