Ich bin seit 2 Jahren ein Java-Entwickler.
Aber ich habe noch nie eine WeakReference in meinen Code geschrieben. Wie verwende ich WeakReference, um meine Anwendung effizienter zu gestalten, insbesondere die Android-Anwendung?
java
android
weak-references
Chris
quelle
quelle
Antworten:
Die Verwendung von a
WeakReference
in Android unterscheidet sich nicht von der Verwendung in einfachem altem Java. Hier ist eine großartige Anleitung, die eine detaillierte Erklärung gibt: Schwache Referenzen verstehen .Sie sollten darüber nachdenken, eine zu verwenden, wenn Sie einen Verweis auf ein Objekt benötigen, aber Sie möchten nicht, dass dieser Verweis das Objekt vor dem Garbage Collector schützt. Ein klassisches Beispiel ist ein Cache, in dem Müll gesammelt werden soll, wenn die Speichernutzung zu hoch wird (häufig implementiert mit
WeakHashMap
).Achten Sie darauf , zu prüfen ,
SoftReference
undPhantomReference
außerdem.EDIT: Tom hat einige Bedenken hinsichtlich der Implementierung eines Caches mit geäußert
WeakHashMap
. Hier ist ein Artikel, der die Probleme beschreibt: WeakHashMap ist kein Cache!Tom hat Recht, dass es Beschwerden über schlechte Netbeans-Leistung aufgrund von
WeakHashMap
Caching gegeben hat.Ich denke immer noch, dass es eine gute Lernerfahrung wäre, einen Cache mit zu implementieren
WeakHashMap
und ihn dann mit Ihrem eigenen handgerollten Cache zu vergleichen, mit dem implementiert wurdeSoftReference
. In der realen Welt würden Sie wahrscheinlich keine dieser Lösungen verwenden, da es sinnvoller ist, eine Bibliothek eines Drittanbieters wie Apache JCS zu verwenden .quelle
WeakHashMap
Die Verwendung als Cache ist fatal. Einträge können entfernt werden, sobald sie erstellt wurden. Dies wird wahrscheinlich nicht passieren, wenn Sie testen, kann aber durchaus sein, wenn Sie es verwenden. Zu beachten ist, dass NetBeans auf diese Weise zu einem effektiven 100% igen CPU-Stopp gebracht werden kann.WeakHashMap
auch wenn Sie richtig sind, dass es eine schlechte Wahl ist;)[EDIT2] Ich habe ein weiteres gutes Beispiel dafür gefunden
WeakReference
. Verarbeiten von Bitmaps Auf der Seite " UI-Thread " im Handbuch " BitmapsWeakReference
anzeigen Effizientes Training" wird eine Verwendung in AsyncTask angezeigt.Es sagt,
Viel Spaß beim Codieren!
[EDIT] Ich habe ein wirklich gutes Beispiel
WeakReference
von Facebook-Android-SDK gefunden . Die ToolTipPopup- Klasse ist nichts anderes als eine einfache Widget-Klasse, die den Tooltip über der Ankeransicht anzeigt. Ich habe einen Screenshot aufgenommen.Die Klasse ist sehr einfach (ca. 200 Zeilen) und sehenswert. In dieser Klasse wird die
WeakReference
Klasse verwendet, um einen Verweis auf die Ankeransicht zu speichern, was durchaus sinnvoll ist, da die Ankeransicht auch dann als Müll gesammelt werden kann, wenn eine Tooltip-Instanz länger als ihre Ankeransicht lebt.Viel Spaß beim Codieren! :) :)
Lassen Sie mich ein Arbeitsbeispiel der
WeakReference
Klasse teilen . Es ist ein kleines Code-Snippet aus dem Android Framework Widget namensAutoCompleteTextView
.Kurz gesagt,
WeakReference
Klasse wird verwendet, um ein Objekt zu haltenView
, um in diesem Beispiel einen Speicherverlust zu verhindern .Ich kopiere einfach die PopupDataSetObserver-Klasse, die eine verschachtelte Klasse von ist
AutoCompleteTextView
. Es ist wirklich einfach und die Kommentare erklären die Klasse gut. Viel Spaß beim Codieren! :) :)Und der
PopupDataSetObserver
wird beim Einstellen des Adapters verwendet.Eine letzte Sache. Ich wollte auch ein funktionierendes Beispiel für eine
WeakReference
Android-Anwendung kennen und konnte einige Beispiele in den offiziellen Beispielanwendungen finden. Aber ich konnte einige von ihnen wirklich nicht verstehen. Zum Beispiel verwenden ThreadSample- und DisplayingBitmaps- AnwendungenWeakReference
in ihrem Code, aber nach dem Ausführen mehrerer Tests stellte ich fest, dass die get () -Methode niemals zurückgegeben wirdnull
, da das referenzierte Ansichtsobjekt in Adaptern recycelt wird und nicht der gesammelte Müll.quelle
Einige der anderen Antworten scheinen unvollständig oder zu lang zu sein. Hier ist eine allgemeine Antwort.
Verwendung von WeakReference in Java und Android
Sie können die folgenden Schritte ausführen:
WeakReference
VariableCode
MyClass
hat einen schwachen Bezug zuAnotherClass
.AnotherClass
hat einen starken Bezug zuMyClass
.Anmerkungen
MyClass
war A. undAnotherClass
war B.WeakReference
besteht darin, dass eine andere Klasse eine Schnittstelle implementiert. Dies erfolgt im Listener / Observer-Muster .Praktisches Beispiel
quelle
// allow MyClass to get a weak reference to this class void someMethod() { mMyClass = new MyClass(); mMyClass.someMethod(this); }
??weakreference
Objekt selbst in derdoSomething
Funktion überprüfen , damit es nichtnull
vor dem Aufruf derget
Funktion vorhanden ist.Bei einer "kanonisierten" Zuordnung behalten Sie eine Instanz des betreffenden Objekts im Speicher und alle anderen suchen diese bestimmte Instanz über Zeiger oder einen solchen Mechanismus. Hier können schwache Referenzen helfen. Die kurze Antwort lautet, dass WeakReference- Objekte verwendet werden können, um Zeiger auf Objekte in Ihrem System zu erstellen, während diese Objekte vom Garbage-Collector zurückgefordert werden können, sobald sie den Gültigkeitsbereich verlassen. Zum Beispiel, wenn ich Code wie diesen hätte:
Jedes Objekt, das ich registriere, wird vom GC niemals zurückgefordert, da im Satz von ein Verweis darauf gespeichert ist
registeredObjects
. Auf der anderen Seite, wenn ich das mache:Wenn der GC dann die Objekte im Set zurückfordern möchte, kann er dies tun. Sie können diese Technik zum Zwischenspeichern, Katalogisieren usw. verwenden. Im Folgenden finden Sie Verweise auf ausführlichere Erläuterungen zu GC und Zwischenspeichern.
Ref: Garbage Collector und WeakReference
quelle