Chronometer sind nicht synchron

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Chronometer sind nicht synchron

    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:

    Quellcode

    1. @Override
    2. public void onClick(View view) {
    3. switch (view.getId()) {
    4. case R.id.btn_chmleft:
    5. if(!chronometerHelper.isRunningLeft()){
    6. if(chronometerHelper.isRunningRight()) {
    7. stopChronometerRight();
    8. }
    9. startChronometerLeft();
    10. }else{
    11. stopChronometerLeft();
    12. }
    13. break;
    14. case R.id.btn_chmright:
    15. if(!chronometerHelper.isRunningRight()){
    16. if(chronometerHelper.isRunningLeft()) {
    17. stopChronometerLeft();
    18. }
    19. startChronometerRight();
    20. }else{
    21. stopChronometerRight();
    22. }
    23. break;
    24. }
    25. }
    26. private void startChronometerRight() {
    27. runR = true;
    28. //setbase
    29. if((chronometerHelper.getOffsetLeft()!= null) && (chronometerHelper.getOffsetRight()!=null)) {
    30. startTime = SystemClock.elapsedRealtime();
    31. chronometerLeft.setBase(startTime - chronometerHelper.getOffsetLeft());
    32. chronometerRight.setBase(startTime - chronometerHelper.getOffsetRight());
    33. chronometer.setBase(startTime - (chronometerHelper.getOffsetRight() + chronometerHelper.getOffsetLeft()));
    34. }
    35. else if(chronometerHelper.getOffsetRight()!= null) {
    36. startTime = SystemClock.elapsedRealtime();
    37. chronometerRight.setBase(startTime - chronometerHelper.getOffsetRight());
    38. chronometer.setBase(startTime - chronometerHelper.getOffsetRight());
    39. }
    40. else if(chronometerHelper.getOffsetLeft()!= null) {
    41. startTime = SystemClock.elapsedRealtime();
    42. chronometerLeft.setBase(startTime - chronometerHelper.getOffsetLeft());
    43. chronometerRight.setBase(startTime);
    44. chronometer.setBase(startTime - chronometerHelper.getOffsetLeft());
    45. }
    46. else {
    47. startTime = SystemClock.elapsedRealtime();
    48. chronometerRight.setBase(startTime);
    49. chronometer.setBase(startTime);
    50. }
    51. //start Chronometer
    52. chronometerRight.start();
    53. chronometer.start();
    54. //Chronometerhelper
    55. chronometerHelper.setRunningRight(runR);
    56. }
    57. private void stopChronometerLeft() {
    58. runL = false;
    59. //stop chronometer
    60. chronometerLeft.stop();
    61. chronometer.stop();
    62. //set offset
    63. pauseOffset = SystemClock.elapsedRealtime() - chronometerLeft.getBase();
    64. //Chronometerhelper
    65. chronometerHelper.setOffsetLeft(pauseOffset);
    66. chronometerHelper.setRunningLeft(runL);
    67. }
    68. private void startChronometerLeft() {
    69. runL = true;
    70. //setbase
    71. if((chronometerHelper.getOffsetLeft()!= null) && (chronometerHelper.getOffsetRight()!=null)) {
    72. startTime = SystemClock.elapsedRealtime();
    73. chronometerLeft.setBase(startTime - chronometerHelper.getOffsetLeft());
    74. chronometerRight.setBase(startTime - chronometerHelper.getOffsetRight());
    75. chronometer.setBase(startTime - (chronometerHelper.getOffsetRight() + chronometerHelper.getOffsetLeft()));
    76. }
    77. else if(chronometerHelper.getOffsetLeft()!= null) {
    78. startTime = SystemClock.elapsedRealtime();
    79. chronometerLeft.setBase(startTime - chronometerHelper.getOffsetLeft());
    80. chronometer.setBase(startTime- chronometerHelper.getOffsetLeft());
    81. }
    82. else if(chronometerHelper.getOffsetRight()!= null) {
    83. startTime = SystemClock.elapsedRealtime();
    84. chronometerRight.setBase(startTime - chronometerHelper.getOffsetRight());
    85. chronometerLeft.setBase(startTime);
    86. chronometer.setBase(startTime - chronometerHelper.getOffsetRight());
    87. }
    88. else {
    89. startTime = SystemClock.elapsedRealtime();
    90. chronometerLeft.setBase(startTime);
    91. chronometer.setBase(startTime);
    92. }
    93. //start Chronometer
    94. chronometerLeft.start();
    95. chronometer.start();
    96. //Chronometerhelper
    97. chronometerHelper.setRunningLeft(runL);
    98. }
    99. private void stopChronometerRight() {
    100. runR = false;
    101. //stop chronometer
    102. chronometerRight.stop();
    103. chronometer.stop();
    104. //set offset
    105. pauseOffset = SystemClock.elapsedRealtime() - chronometerRight.getBase();
    106. //Chronometerhelper
    107. chronometerHelper.setOffsetRight(pauseOffset);
    108. chronometerHelper.setRunningRight(runR);
    109. }
    110. }
    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. ;(