Hallo Liebe Community!
Ich bin neu in diesem Forum und bin froh, dass es auch ein deutschsprachiges Android Forum gibt, wo sich Programmierer untereinander austauschen können. Seit längerem bastel ich mit Chronometern herum, aber bei diesem Fehler komme ich alleine nicht mehr weiter.
Zu meinem Problem:
Ich habe drei Chronometer in meiner App (Hauptchronometer, ChronometerLinks und ChronometerRechts). Der Hauptchronometer aktualisiert die vergangenen Sekunden nach jedem Klick der anderen beiden Chronometer. Anbei ein Beispiel:
Wenn ChronometerLinks gestartet und nach 16 Sekunden gestoppt wird, speichere ich diesen Wert in eine Variable (Offset). Wenn ich diesen Schritt für ChronometerRechts wiederhole, habe ich einen Offset von insgesamt 32 Sekunden. Dieser Wert soll folglich auch bei dem Hauptchronometer angezeigt werden.
Jetzt kommt es aber vor, wenn ich mehrmals einen Chronometer gestoppt und gestartet habe, dass der Hauptchronometer um eine Sekunde voraus ist. So steht bspws. bei dem vorangegangen Beispiel nicht 32 Sekunden als Offset, sondern bereits 33, während die anderen noch jeweils bei 16 Sekunden stehen. Ich habe schon verschiedene Lösungsansätze ausprobiert, doch finde ich hierbei keine geeignete Lösung.
Anbei seht ihr meinen Code:
@Override
public void onClick(View view) {
switch (view.getId()) {
case R.id.btn_chmleft:
if(!chronometerHelper.isRunningLeft()){
if(chronometerHelper.isRunningRight()) {
stopChronometerRight();
}
startChronometerLeft();
}else{
stopChronometerLeft();
}
break;
case R.id.btn_chmright:
if(!chronometerHelper.isRunningRight()){
if(chronometerHelper.isRunningLeft()) {
stopChronometerLeft();
}
startChronometerRight();
}else{
stopChronometerRight();
}
break;
}
}
private void startChronometerRight() {
runR = true;
//setbase
if((chronometerHelper.getOffsetLeft()!= null) && (chronometerHelper.getOffsetRight()!=null)) {
startTime = SystemClock.elapsedRealtime();
chronometerLeft.setBase(startTime - chronometerHelper.getOffsetLeft());
chronometerRight.setBase(startTime - chronometerHelper.getOffsetRight());
chronometer.setBase(startTime - (chronometerHelper.getOffsetRight() + chronometerHelper.getOffsetLeft()));
}
else if(chronometerHelper.getOffsetRight()!= null) {
startTime = SystemClock.elapsedRealtime();
chronometerRight.setBase(startTime - chronometerHelper.getOffsetRight());
chronometer.setBase(startTime - chronometerHelper.getOffsetRight());
}
else if(chronometerHelper.getOffsetLeft()!= null) {
startTime = SystemClock.elapsedRealtime();
chronometerLeft.setBase(startTime - chronometerHelper.getOffsetLeft());
chronometerRight.setBase(startTime);
chronometer.setBase(startTime - chronometerHelper.getOffsetLeft());
}
else {
startTime = SystemClock.elapsedRealtime();
chronometerRight.setBase(startTime);
chronometer.setBase(startTime);
}
//start Chronometer
chronometerRight.start();
chronometer.start();
//Chronometerhelper
chronometerHelper.setRunningRight(runR);
}
private void stopChronometerLeft() {
runL = false;
//stop chronometer
chronometerLeft.stop();
chronometer.stop();
//set offset
pauseOffset = SystemClock.elapsedRealtime() - chronometerLeft.getBase();
//Chronometerhelper
chronometerHelper.setOffsetLeft(pauseOffset);
chronometerHelper.setRunningLeft(runL);
}
private void startChronometerLeft() {
runL = true;
//setbase
if((chronometerHelper.getOffsetLeft()!= null) && (chronometerHelper.getOffsetRight()!=null)) {
startTime = SystemClock.elapsedRealtime();
chronometerLeft.setBase(startTime - chronometerHelper.getOffsetLeft());
chronometerRight.setBase(startTime - chronometerHelper.getOffsetRight());
chronometer.setBase(startTime - (chronometerHelper.getOffsetRight() + chronometerHelper.getOffsetLeft()));
}
else if(chronometerHelper.getOffsetLeft()!= null) {
startTime = SystemClock.elapsedRealtime();
chronometerLeft.setBase(startTime - chronometerHelper.getOffsetLeft());
chronometer.setBase(startTime- chronometerHelper.getOffsetLeft());
}
else if(chronometerHelper.getOffsetRight()!= null) {
startTime = SystemClock.elapsedRealtime();
chronometerRight.setBase(startTime - chronometerHelper.getOffsetRight());
chronometerLeft.setBase(startTime);
chronometer.setBase(startTime - chronometerHelper.getOffsetRight());
}
else {
startTime = SystemClock.elapsedRealtime();
chronometerLeft.setBase(startTime);
chronometer.setBase(startTime);
}
//start Chronometer
chronometerLeft.start();
chronometer.start();
//Chronometerhelper
chronometerHelper.setRunningLeft(runL);
}
private void stopChronometerRight() {
runR = false;
//stop chronometer
chronometerRight.stop();
chronometer.stop();
//set offset
pauseOffset = SystemClock.elapsedRealtime() - chronometerRight.getBase();
//Chronometerhelper
chronometerHelper.setOffsetRight(pauseOffset);
chronometerHelper.setRunningRight(runR);
}
}
Alles anzeigen
Ich denke auch, dass es nicht unbedingt der beste Code ist, den ich geschrieben habe. Vielleicht gibt es ja alternative Möglichkeiten, die ich (noch) nicht kenne. Ich wäre dankbar für jede Antwort.