Wpis z mikrobloga

Mam zagwozdkę. Utknąłem. Powiedzmy, że mam Service. W jej onCreate jest postDelayed Handler, który jak to takowy startuje z opóźnieniem, z tym, że po zrobieniu roboty ustawia sobie kolejne postDelayed żeby w kółko coś sobie robić co jakiś czas. Chcę go uśpić na jakiś czas, więc robię mu wait() czy inne sleep(). No i wszystko jest spoko, Service mogę zatrzymać robiąc jej stop itp. Problem pojawia się w momencie, gdy chcę ubić aplikację, więc wysłajpuje ją na bok w recents, żeby system sobie oznaczył apkę do zutylizowania. Normalnie w takiej sytuacji zamknięcie Activity jakiejś tam, sprawia, że Service na chwilę też znika, ale, że jest sticky to system robi natychmiast jej ponowne uruchomienie i leci od nowa onCreate. Jeśli natomiast ten Handler śpi to nie wywołuje się onDestroy, bo jest ewidentnie blokada jakaś, ale imho to powinna być tylko blokada Handlera, a jakby to powiedzieć, blokuje się całość. Próbowałem zsynchronizować to spanie na obiekt i w onDestroy robić notify(), ale nadal nic się nie dzieje. Mam nadzieję, że ktoś coś zrozumiał xD Nie mam pod ręką snippeta, bo ciągle modyfikuję swoje rozwiązanie. Innymi słowy szukam skutecznego sposobu, żeby uśpić Handler, a Service żeby się wtedy poprawnie i tak destroyował. Niby mogę użyć kolejnego wątka, wszystko tam #!$%@?ć i to jemu kazać spać, ale jakoś takie to mało eleganckie. Wątki w wątkach. Czy może nie przejmować się #!$%@??

TL;DR

Uśpiony Handler, bo to w końcu też wątek, blokuje onDestroy w mojej usłudze jak system chce automatycznie ubić apkę. A w onDestroy ów Handler właśnie powinien być anulowany itp. No i zasadniczo ta usługa wisi, zamiast restartować się jak powinna.

#android #androiddev #java
  • 2