Ostatnio zajmowałem się dodaniem nowej funkcjonalności w jednej z aplikacji androidowych dla naszego klienta. W tym celu skorzystałem z gotowej biblioteki, która implementowała listenery na content provider – potrzebowałem dowiedzieć się kiedy jeden z kluczy w content providerze zostanie zmieniony i jaka będzie jego nowa wartość.
Biblioteka, która zajmuje się obsługą content providera pozwala na zarejestrowania listenera na wszelkie zmiany wartości kluczy w tym content providerze.
To co zrobiłem, to zarejestrowałem listenera za pomocą wywołania API tej biblioteki. Niestety, nie sprawdziłem że listener jest przechowany w HashMapie, która przechowuje zarejestrowany listenery jako słabe referencje. Efekt był taki, że mój obiekt, który zarejestrowałem jako listener był sprzątany przez garbage collector zaraz po wyjściu z metody w której go utworzyłem i zarejestrowałem jako listener.
Doceniłem WeakReference dopiero kiedy zrozumiałem jej działanie w tym konkretnym przykładzie. Słaba referencja chroni przed wyciekiem pamięci.
W momencie utworzenia obiektu i następnie zarejestrowania go jako listenera lista listenerów będzie przechowywała referencje do obiektu listenera. Dlatego obiekt nie będzie mógł być posprzątany przez garbage collector.
Inne tematy w dziale Technologie