postDelayed läuft trotz removeCallbacks weiter

  • Antworten:0
Artur Zimner
  • Forum-Beiträge: 2

16.11.2011, 21:15:23 via Website

hi bin neu hier und auch in der android bzw. java welt, probier gerade mein erstes app zu proggen. nachdem ich mit den grundlagen gut zurecht kamm hänge ich trotz google und co seit ein paar tagen an einem problem, ich hoffe ich kann es detailiert genug beschreiben. ich fang einfach mal an

ich möchte einen timer schreiben der sekündlich eine zahl hochsetzt. ist die zahl bei z.b. 100 soll ein alarm klingeln. das mache ich auf folgenden weg:

- activity wird gestartet
- timer steht bei 0
- play button wird geklickt und timer startet mit fogendem code

1handler.postDelayed(runnable, intervall);

in meiner klasse habe ich noch fogendes:

1private Runnable runnable = new Runnable() {
2 @Override
3 public void run() {
4 countClock();
5 handler.postDelayed(this, intervall);
6
7 }
8 };

beim klick auf den play button wird dieser zum pause button und beim klick auf pause rufe ich folgendes auf.

1handler.removeCallbacks(runnable);

das funktioniert auch alles wunderbar. wenn da nicht die zustände wären die so ein gerät einnehmen kann.

wenn die activity überlagert wird von einem telefonanruf oder so oder wenn ich die home tase drücke(nicht die zurück taste) soll der timer im hintergrund weiterlaufen was er auch von natur aus tut. wenn die activty wieder im vordergund ist hole ich mir die alten werte mit

1onRestoreInstanceState(Bundle savedInstanceState)

und setzt die werte wieder.

leider wird die gui nicht mehr sekündlich upgedatet.

ich muß erst wieder in der onRestore methode
1handler.removeCallbacks(runnable);
2 handler.postDelayed(runnable, 1000);
ausführen damit die gui wieder sekündlich upgedatet wird. das problem ist der removeCallback funktioniert nicht.ich habe das gefühl das runnable zu dem zeitpunkt eine neue instant ist und removeCallback nicht weiß was er killen soll. zwar wird der timer wieder richtig hochgezählt aber irgendwie wird die alte runnable instanz nicht gekillt. das sehe ich einerseitst in der Logcat. da lasse ich mir die nächste zahl immer ausgegben, diese sieht dann so aus

TAG TEXT
counrer 15
counter 27
counter 16
counter 28
counter 17
counter 29

usw.
wenn ich drei anrufe in der zeit erhalte oder den bildschirt mehrmals drehe habe ich auch schon mal 3 bis 9 instanzen in der Logcat die mir alle den tag counter ausspucken.
ausserdem klingelt der alarm zwar auch bei 100 aber im hintergrund beliebig oft.

wenn ich in der
1onSaveInstanceState(Bundle outState)

das removeCallback aufrufe habe ich nie mehr als eine instanz im logcat

ich frage mich ob ich überhaupt den richtigen lösungsansatz wähle.

hoffe habe mich verständlich ausgedrückt und jemand von euch kann mir weiterhelfen

egal was passier es soll auch im hintergrund nur einmal runnable ausgeführt werden.

Antworten