Chronometer onTickListener

  • Hallo.


    Ich programmiere zusammen mit einem Kumpel im Rahmen einer Ausarbeitung im Studim eine Fußball-Schiedsrichter-App.
    Nun haben wir zum Ende unseres Projektes einen kleinen Fehler entdeckt.


    Es gibt zwei Chronometer:
    1. Chronometer
    Halbzeit 1: 00:00 bis 45:00
    Halbzeit 2: 45:00 bis 90:00
    2. Chronometer
    (Nachspielzeit) 00:00 bis Button "Hz beenden" geklickt


    Zusätzlich vibriert das Handy 5 Sekunden vor Halbzeitende, um den Schiri zu informieren.



    Im Hauptfenster läuft das Ganze einwandfrei.
    Ist die Zeit allerdingt bei 44:50 (10 Sekunden vor Hz-Ende) und ich möchte eine gelbe Karte eintragen (also eine neue Activity aufrufen) gibt es ein Problem: Beim Eintragen der Karte virbriert das Handy erstens nicht (5 Sek vor Hz-Ende) und wenn die Karte eingetragen wurde, dies insgesamt länger als die 10 noch zu spielenden Sekunden gedauert hat, läuft das 1.Chronometer weiter (steht also z.B. bei 45:20, ohne dass das zweite Chronometer für die Nachspielzeit aufgerufen wird)...


    Die Frage ist also:
    Wie bleibt der OnChronometerTickListener (im Hauptfenster - onPause) aktiv, obwohl eine andere Activity aktiv ist?

  • Er tut es einfach, weil er ein eigenes Objekt ist, welches von der Hauptactivity unabhängig ist.
    Vermutlich beendest du die Hauptactivity auch nicht, nachdem du die Activity für die Eintragung aufgerufen hast, also kann er fröhlich weiter vor sich hin laufen.


    Das heißt also, der Fehler wird irgendwo in der Implementierung der Hauptactivity oder dem OnTickListener liegen. ;)

    Je mehr Käse, desto mehr Löcher.
    Je mehr Löcher, desto weniger Käse.
    Daraus folgt: je mehr Käse, desto weniger Käse.


    »Dies ist ein Forum. Schreibt Eure Fragen in das Forum, nicht per PN!«

  • Hallo. Danke für die Antwort.
    Das ist richtig. Die Hauptactivity bleibt offen, soll sie auch.
    Der Timer (erstes Chronometer) soll ebenfalls weiterlaufen, nur eben das zweite Chronometer starten, sobald der erste seine Zeit erreicht hat.


    Solange das Hauptfenster aktiv ist, funktioniert eben auch alles so wie es soll.
    Ist aber eine andere activity offen (Rote Karte, Gelbe Karte, Auswechslung, ..), ist der OnChronometerTickListener halt leider nicht mehr aktiv.

  • Ah, dann habe ich die erste Darstellung missverstanden.


    Es klang so, als sei der Listener trotzdem aktiv, ist er aber offenbar nicht mehr.
    Vermutlich hast du den Listener intern implementiert, also die Activity implementiert das Protokoll oder du hast dem Chronometer das Ganze als 'anonymous inner class' mitgegeben.


    Ich würde an der Stelle versuchen, eine öffentliche Klasse für die unterschiedlichen OnTickListener zu implementieren.
    Inwieweit da Callbacks helfen weiß ich allerdings nicht, da ja das Hauptproblem (Activity gerade im Hintergrund) weiterhin Bestand hat.


    Vermutlich solltet ihr den kompletten Aufbau ein wenig ändern.
    Dazu habe ich ein nettes Video mit netten Ansätzen gefunden:
    http://blog.ralfw.de/2013/01/s…video-ein-experiment.html
    Ist zwar auf .NET/C# Basis, dürfte sich jedoch simpel umsetzen lassen.


    Euer ‚Problem‘: Ihr nutzt ein UI Element (Chronometer) um die Zeit zu messen. Wie ihr festgestellt habt geht das in die Hose, sobald das dieses UI Element beherbergende Codestück nicht mehr greifbar ist.
    Sinnvoller wäre es, das Ganze anders herum aufzuziehen: ihr habt irgend ein Systemdingens, um die Zeit zu messen. Wenn das UI Element zur Zeitanzeige da ist, dann wird es aktualisiert.


    In dem Fall könnt ihr ganz einfach prüfen, ob die Zeit jetzt >45 Minuten ist. Falls ja, wird alles Größere einfach auf die zweite Anzeige gepackt.

    Je mehr Käse, desto mehr Löcher.
    Je mehr Löcher, desto weniger Käse.
    Daraus folgt: je mehr Käse, desto weniger Käse.


    »Dies ist ein Forum. Schreibt Eure Fragen in das Forum, nicht per PN!«

  • Mir fehlt in der Diskussion noch das Stichwort "Service" - wo schon dauernd von Hintergrund gesprochen wird.


    Ist zwar immer in bisschen kompliziert, sich mit dem Service zu verbinden, aber dafür hat man eine Instanz die sich um den Hintergrundkrempel kümmert und auch noch aktiv bleibt, wenn die Activity durch z.B. eingehenden Anruf mal vom Schirm verschwindet.


    Außerdem kannst du den Service dann mit einem Timer versehen, der die verschiedenen Start- und Stop-Zeiten alle kennt und damit den Gesamtüberblick über den Zietablauf hat.

  • Im Prinzip klingt so ein Service ja ganz toll.
    Mir fehlt da nur so ein bisschen die Transparenz des Ganzen.


    Also vor Allem die Kommunikation des Services mit meiner App erschließt sich mir noch nicht so ganz.
    Wenn ich mal ein wenig Zeit über habe versuche ich mal, ein bisschen Backgroundaktivität an einen eigenen Service zu übergeben.
    Mal sehen, wie das wird.


    Auf jeden Fall vielen Dank für das Stichwort! :)

    Je mehr Käse, desto mehr Löcher.
    Je mehr Löcher, desto weniger Käse.
    Daraus folgt: je mehr Käse, desto weniger Käse.


    »Dies ist ein Forum. Schreibt Eure Fragen in das Forum, nicht per PN!«

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!