Static singleton lifetime w Androidzie

Mam niejasną sytuację:

Czy singletony statyczne będą zbierane śmieci po zniszczeniu ostatniej działalności gospodarstwa referencyjnego? Ponieważ nie ma więcej odniesień w aplikacji do instancji singleton. Czy mogę więc polegać na singletonach?

By official Android doc :

Zwykle nie ma potrzeby podkategoryzowania aplikacji. W większości sytuacji, statyczne singletony mogą zapewnić tę samą funkcjonalność w bardziej modułowym sposób.

By jakiś post:

Https://web.archive.org/web/20160729201921/http://www.devahead.com/blog/2011/06/extending-the-android-application-class-and-dealing-with-singleton/

Podczas tworzenia aplikacji, znalazłem że czasami niektóre zmienne statyczne związane z działaniami zdarzały się bądź niewtajemniczony, nawet jeśli wcześniej zostały zainicjowane ! I myslalem, ze gdy statyczna zmienna jest inicjalizowana pozostaje tak dla całe życie aplikacji, ale wydaje się, że tak nie jest.

Innymi słowy, jeśli nic nie trzyma odniesienia do mojej statycznej klasy singleton, co ma zapobiec jej zbieraniu i niszczeniu?

Author: Gabor, 2012-12-15

4 answers

Nie, ponieważ jeśli jest singletonem, jest przechowywany jako pole static w swojej klasie i zazwyczaj singletony nie są niszczone przez klientów, tzn. nie można umieścić statycznej metody deleteInstance(), która ustawia odniesienie do {[2] } tak, że jeśli nikt inny go nie używa, kwalifikuje się do zbierania śmieci. W przypadku pól statycznych, usuwanie śmieci nastąpi, gdy classloader, który załadował klasę, zostanie odrzucony.

Z tego powodu samo słowo kluczowe static może powodować wycieki pamięci, jeśli odwołuje się do aktywności przedmiotów, więc należy być bardzo ostrożnym podczas korzystania z niego.

 15
Author: Raffaele,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-12-15 10:03:02

Tak. Za każdym razem, gdy opuszczasz aplikację (na przykład aplikacja otwiera aplikację aparatu, aby zrobić zdjęcie, lub otwiera przeglądarkę, aby otworzyć łącze, lub użytkownik po prostu naciska przycisk Wstecz), istnieje możliwość, że twój Application obiekt zostanie zniszczony i odtworzony po przejściu z powrotem do aplikacji.

Powinieneś zainicjować dowolną zmienną statyczną w bloku static {} w twojej klasie Application, jeśli ją posiadasz, lub w Activities, aby upewnić się, że nie będzie null.

Zauważ, że jest to bardziej prawdopodobnie wystąpi ten problem na urządzeniach ze słabszym sprzętem, mniejszą pamięcią, ale należy się spodziewać, że może się zdarzyć na każdym urządzeniu.

Najważniejsze jest to, że w Androidzie nie oczekuj, że Twoje zmienne statyczne pozostaną w pamięci w dowolnym momencie. Zawsze sprawdzaj, czy istnieją i w razie potrzeby wznawiaj je we właściwych miejscach.

EDIT:

Wiem, że minęło dużo czasu, i zupełnie zapomniałem o tym wątku, w każdym razie, tutaj jest źródło z oficjalnego Androida dokumentacja cyklu życia:

Http://developer.android.com/training/basics/activity-lifecycle/recreating.html

 5
Author: Adam L. Mónos,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-10-07 07:32:16

Nie można kontrolować, kiedy dokładnie Obiekty Javy stają się śmieciami. Obiekt staje się kwalifikowany do zbierania śmieci, gdy nie ma więcej (niekolizyjnych) odniesień do niego. Z Androidem nie możesz kontrolować, kiedy Twoja aktywność zostanie usunięta z pamięci.

Singletony mają reprezentować coś, co zawsze istnieje.
  • Nie możesz zmusić żadnego obiektu do zbierania śmieci; możesz zażądać aby garbage collector uruchomił z System.gc() ale to tylko prośba.

  • Jeśli chcesz, aby" singleton " kwalifikował się do zbierania śmieci, prawdopodobnie chciałbyś mieć metodę, aby ustawić zmienną statyczną na null (i mieć nadzieję, że nic innego nie pobrało kopii odniesienia). Oczywiście następnym razem, gdy ktoś poprosi o przykład, będzie musiał zostać odtworzony. w tym momencie to nie jest tak naprawdę singleton, oczywiście.

 4
Author: Sahil Mahajan Mj,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-12-15 10:07:25

Wszystkie obiekty singleton pozostaną, nawet jeśli aktywność zostanie zniszczona.

 -3
Author: Nasif Noorudeen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-12-30 11:37:20