Wie benutzt man WeakReference in der Entwicklung von Java und Android?
Ich habe ein java-Entwickler für 2 Jahre.
Aber ich habe nie geschrieben, eine WeakReference in meinem code. Wie zu verwenden WeakReference, um meine Anwendung effizienter, vor allem die Android-Anwendung?
InformationsquelleAutor der Frage Chris | 2010-07-14
Du musst angemeldet sein, um einen Kommentar abzugeben.
Mit einem
WeakReference
bei Android nicht anders als mit einem in plain old Java. Hier ist ein Super guide, gibt eine detaillierte Erklärung: Verständnis Schwache Verweise.Sollten Sie darüber nachdenken, mit einer Wann immer Sie eine Referenz auf ein Objekt, aber Sie wollen nicht, dass die Referenz zu schützen, wird das Objekt von der garbage collector. Ein klassisches Beispiel ist ein cache, der Sie sein wollen, Müll gesammelt, wenn die Speicherauslastung zu hoch wird (oft mit
WeakHashMap
).Werden Sie sicher, dass Sie
SoftReference
undPhantomReference
als gut.EDIT: Tom hob einige Bedenken über die Implementierung eines cache mit
WeakHashMap
. Hier ist ein Artikel über das Probleme: WeakHashMap ist kein cache!Tom ist richtig, dass es Beschwerden über schlechte Netbeans performance durch
WeakHashMap
Zwischenspeichern.Ich denke immer noch, es wäre eine gute Erfahrung zur Implementierung eines cache mit
WeakHashMap
und dann vergleichen Sie es gegen Ihre eigenen selbstgedrehten cache implementiert, mitSoftReference
. In der realen Welt, würden Sie wahrscheinlich nicht verwenden Sie eine dieser Lösungen, denn es macht mehr Sinn, sich mit einem 3rd-party-Bibliothek, wie Apache JCS.InformationsquelleAutor der Antwort dbyrne
[EDIT2] fand ich ein gutes Beispiel
WeakReference
. Die Verarbeitung von Bitmaps Aus dem UI-Thread Seite in Anzeige Von Bitmaps Effizient training guide, zeigt eine Verwendung vonWeakReference
im AsyncTask.Er sagt,
Happy coding!
[BEARBEITEN] fand ich ein wirklich gutes Beispiel für
WeakReference
aus facebook-android-sdk. ToolTipPopup Klasse ist nichts aber ein einfaches widget-Klasse, die zeigt, dass der tooltip vor Anker anzeigen. Ich nahm einen screenshot.Die Klasse ist wirklich einfach(über 200 Zeilen) und würdig zu betrachten. In dieser Klasse
WeakReference
Klasse wird verwendet, um zu halten, Verweis zu Anker Ansicht, das macht Sinn, denn er macht es möglich für Anker Ansicht zu sein, Müll gesammelt, auch wenn eine tooltip-Instanz länger lebt als sein Anker anzeigen.Happy coding! 🙂
Lassen Sie mich ein Beispiel
WeakReference
Klasse. Es ist ein kleines code-snippet aus dem Android-framework-widgets genanntAutoCompleteTextView
.In kurzen,
WeakReference
Klasse wird verwendet, um zu haltenView
Objekt zu verhindern Speicherverlust in diesem Beispiel.Werde ich einfach kopieren-und-einfügen PopupDataSetObserver-Klasse ist eine geschachtelte Klasse
AutoCompleteTextView
. Es ist wirklich einfach und die Kommentare erklärt der Klasse gut. Happy coding! 🙂Und die
PopupDataSetObserver
verwendet wird, bei der Festlegung adapter.Eine Letzte Sache. Ich wollte auch wissen, Beispiel arbeiten
WeakReference
im Android-Anwendung, und ich könnte einige Beispiele in seiner offiziellen Probe-Anwendungen. Aber ich konnte wirklich nicht verstehen, einige von Ihnen nutzen. Zum Beispiel, ThreadSample und DisplayingBitmaps Anwendungen verwendenWeakReference
im code, aber nach dem ausführen von mehreren tests fand ich heraus, dass die get () - Methode kehrt nie zurücknull
weil referenzierten view-Objekt ist Recycling in-Adapter, dann lieber Müll gesammelt.InformationsquelleAutor der Antwort 김준호
Einige der anderen Antworten scheinen unvollständig oder übermäßig lange. Hier ist eine Allgemeine Antwort.
Wie zu verwenden WeakReference in Java und Android
Können Sie die folgenden Schritte aus:
WeakReference
variableCode
MyClass
hat einen schwachen Verweis aufAnotherClass
.AnotherClass
hat einen starken Bezug zurMyClass
.Hinweise
MyClass
war undAnotherClass
war B.WeakReference
ist eine andere Klasse eine Schnittstelle implementieren. Dies geschieht in der Listener/Observer-Pattern.Praktischen Beispiel
InformationsquelleAutor der Antwort Suragch
Einen "kanonisierten" mapping, in dem Sie eine Instanz des Objekts in Frage, die im Speicher und alle anderen sehen bis auf die jeweilige Instanz über Zeiger oder somesuch-Mechanismus. Dies ist, wo Wochen-Referenzen können Hilfe.
Die kurze Antwort ist, dass WeakReference Objekte können verwendet werden, um Zeiger auf Objekte in Ihrem system, während noch erlauben diese Objekte zu reklamieren, die von der garbage-collector sobald Sie pass out of scope. Zum Beispiel wenn ich code wie diesen:
Jedes Objekt, ich melde mich nie zurückgefordert werden, die durch die GC, weil es ist ein Verweis darauf gespeichert, die in dem Satz von
registeredObjects
. Auf der anderen Seite, wenn ich dies tun:Dann, wenn der GC reklamieren will die Objekte in der Menge, es wird in der Lage sein, dies zu tun.
Sie können dieses Verfahren verwenden, für caching, Katalogisierung, etc. Siehe unten für Hinweise auf tiefergehende Diskussionen von GC und caching.
Ref: Garbage collector und WeakReference
InformationsquelleAutor der Antwort Akshay