Jestem programistą Java od 2 lat.
Ale nigdy nie napisałem WeakReference w moim kodzie. Jak używać WeakReference, aby zwiększyć wydajność mojej aplikacji, zwłaszcza aplikacji na Androida?
java
android
weak-references
Chris
źródło
źródło
Odpowiedzi:
Używanie
WeakReference
w Androidzie nie różni się niczym od używania w zwykłej starej Javie. Oto świetny przewodnik, który zawiera szczegółowe wyjaśnienie: Zrozumienie słabych odniesień .Powinieneś pomyśleć o użyciu takiego, gdy potrzebujesz odwołania do obiektu, ale nie chcesz, aby to odwołanie chroniło obiekt przed odśmiecaniem pamięci. Klasycznym przykładem jest pamięć podręczna, która ma zostać usunięta, gdy użycie pamięci stanie się zbyt wysokie (często implementowane z
WeakHashMap
).Koniecznie sprawdź
SoftReference
iPhantomReference
też.EDYCJA: Tom zgłosił pewne obawy dotyczące implementacji pamięci podręcznej z
WeakHashMap
. Oto artykuł opisujący problemy: WeakHashMap nie jest pamięcią podręczną!Tom ma rację, że były skargi na słabą wydajność Netbeans z powodu
WeakHashMap
buforowania.Nadal uważam, że warto byłoby zaimplementować pamięć podręczną z,
WeakHashMap
a następnie porównać ją z własną ręcznie zwijaną pamięcią podręczną zaimplementowaną w programieSoftReference
. W prawdziwym świecie prawdopodobnie nie użyłbyś żadnego z tych rozwiązań, ponieważ bardziej sensowne jest użycie biblioteki innej firmy, takiej jak Apache JCS .źródło
WeakHashMap
używany jako pamięć podręczna jest śmiertelny. Wpisy można usunąć zaraz po ich utworzeniu. Prawdopodobnie nie wydarzy się to podczas testowania, ale może się zdarzyć podczas użytkowania. Warto zauważyć, że NetBeans może zostać przez to doprowadzony do efektywnego zatrzymania procesora w 100%.WeakHashMap
nawet jeśli masz rację, że jest to zły wybór;)[EDIT2] Znalazłem inny dobry przykład
WeakReference
. Przetwarzania bitmapy Off wątku UI stronie w Wyświetlanie bitmapy Skutecznie Training Guide, pokazuje jedno użycieWeakReference
w AsyncTask.To mówi,
Miłego kodowania!
[EDYCJA] Znalazłem naprawdę dobry przykład
WeakReference
z facebook-android-sdk . Klasa ToolTipPopup to nic innego jak prosta klasa widżetu, która wyświetla podpowiedź nad widokiem zakotwiczenia. Zrobiłem zrzut ekranu.Klasa jest naprawdę prosta (około 200 linii) i godna obejrzenia. W tej klasie
WeakReference
klasa jest używana do przechowywania odwołania do widoku zakotwiczenia, co ma sens, ponieważ umożliwia gromadzenie widoku zakotwiczenia jako śmieci nawet wtedy, gdy instancja podpowiedzi trwa dłużej niż jej widok zakotwiczenia.Miłego kodowania! :)
Pozwólcie, że podzielę się jednym działającym przykładem
WeakReference
klasy. To mały fragment kodu z widgetu platformy Android o nazwieAutoCompleteTextView
.Krótko mówiąc,
WeakReference
klasa jest używana do przechowywaniaView
obiektu, aby zapobiec wyciekowi pamięci w tym przykładzie.Po prostu skopiuję i wkleję klasę PopupDataSetObserver, która jest zagnieżdżoną klasą
AutoCompleteTextView
. To naprawdę proste, a komentarze dobrze wyjaśniają zajęcia. Miłego kodowania! :)I
PopupDataSetObserver
jest używany do ustawiania adaptera.Ostatnia rzecz. Chciałem również poznać działający przykład
WeakReference
aplikacji na Androida i mogłem znaleźć kilka próbek w jej oficjalnych przykładowych aplikacjach. Ale naprawdę nie mogłem zrozumieć zastosowania niektórych z nich. Na przykład aplikacje ThreadSample i DisplayingBitmaps używająWeakReference
w swoim kodzie, ale po wykonaniu kilku testów okazało się, że metoda get () nigdy nie zwracanull
, ponieważ obiekt widoku, do którego istnieje odwołanie, jest przetwarzany w adapterach, a nie zbierany jako śmieci.źródło
Niektóre z pozostałych odpowiedzi wydają się niepełne lub zbyt długie. Oto ogólna odpowiedź.
Jak używać WeakReference w Javie i Androidzie
Możesz wykonać następujące kroki:
WeakReference
zmiennąKod
MyClass
ma słabe odniesienie doAnotherClass
.AnotherClass
ma silne odniesienie doMyClass
.Uwagi
MyClass
A iAnotherClass
był B.WeakReference
jest implementacja interfejsu przez inną klasę. Odbywa się to we wzorcu Listener / Observer .Praktyczny przykład
źródło
// allow MyClass to get a weak reference to this class void someMethod() { mMyClass = new MyClass(); mMyClass.someMethod(this); }
??weakreference
sam obiekt wdoSomething
funkcji nie występujenull
przed wywołaniemget
funkcji.Mapowanie „kanoniczne” polega na tym, że zachowuje się w pamięci jedną instancję danego obiektu, a wszystkie inne wyszukują tę konkretną instancję za pomocą wskaźników lub innego mechanizmu. Tutaj mogą pomóc słabe referencje. Krótka odpowiedź jest taka, że obiektów WeakReference można używać do tworzenia wskaźników do obiektów w systemie, jednocześnie umożliwiając odzyskiwanie tych obiektów przez moduł odśmiecania pamięci, gdy wyjdą poza zakres. Na przykład gdybym miał taki kod:
Żaden obiekt, który zarejestruję, nigdy nie zostanie odzyskany przez GC, ponieważ istnieje do niego odniesienie przechowywane w zbiorze
registeredObjects
. Z drugiej strony, jeśli to zrobię:Wtedy, gdy GC zechce odzyskać obiekty ze zbioru, będzie w stanie to zrobić. Możesz użyć tej techniki do buforowania, katalogowania itp. Poniżej znajdziesz odniesienia do znacznie bardziej szczegółowych dyskusji na temat GC i buforowania.
Ref: Garbage collector i WeakReference
źródło