Android – java – WeakReferenzen mit einer ArrayList?
Ich weiß das mit einer WeakReference
, wenn ich eine WeakReference
zu etwas WeakReference
, es sei denn, es gibt einen direkten Hinweis darauf, dass es Müll mit dem nächsten GC-Zyklus gesammelt wird. Meine Frage wird, was, wenn ich eine ArrayList
von WeakReference
s WeakReference
?
Beispielsweise:
- Schwache hashmap mit schwachen referenzen auf die werte
- Weakreference get () Methode wie sicher ist es? (Android, asynctask)
- HashMap mit schwachen Werten
- Sollten Adapter in Android statische innere Klassen oder nicht-statische innere Klassen sein
- Wie benutzt man WeakReference in Java und Android Entwicklung?
- Android Weak Referenz von Inner Class
ArrayList<WeakReference<String>> exArrayList; exArrayList = new ArrayList<WeakReference<String>>(); exArrayList.add(new WeakReference<String>("Hello"));
Ich kann nun mit exArrayList.get(0).get()
auf die Daten exArrayList.get(0).get()
.
Meine Frage wird: Dies ist WeakReference
Daten, werden die Daten bei exArrayList.get(0)
GC'd mit dem nächsten GC-Zyklus? (Auch wenn ich nicht einen direkten Hinweis darauf habe) oder wird diese besondere Referenz arraylist
bis der arraylist
entleert ist? ( exArrayList.clear();
: exArrayList.clear();
).
Wenn dies ein Duplikat ist, habe ich es nicht mit meinen Keywords in Google gefunden.
3 Solutions collect form web for “Android – java – WeakReferenzen mit einer ArrayList?”
-
exArrayList.add(new WeakReference<String>("Hello"));
Ist ein schlechtes Beispiel, weilString
Literale niemals GC-ed sind -
Wenn es zB
exArrayList.add(new WeakReference<Object>(new Object()));
Dann nach einem GC würde das Objekt GC-ed sein, aberexArrayList.get(0)
würde immer wiederWeakReference
, obwohlexArrayList.get(0).get()
würdenull
Die Daten bei exArrayList.get(0)
ist die WeakReference
. Es ist nicht von selbst eine schwache Referenz, also wird es nicht gesammelt …
ABER das von exArrayList.get(0)
verwiesene Objekt wird schwach referenziert, also kann es jederzeit gced sein (natürlich, das erfordert, dass es keine starken Verweise auf dieses Objekt gibt).
Damit
data.get(0)
wird nicht null
, aber data.get(0).get()
könnte werden.
Mit anderen Worten, die Liste bezieht sich nicht auf das schwache referenzierte Objekt, sondern auf die schwache Referenz selbst.
Dies ist eine schlechte Idee, wie die anderen Plakate oben erklärt (Referenzobjekte nicht befreit). Verwenden Sie eine WeakHashMap mit den Objekten als Schlüssel und einige Dummy-Werte ("" oder Boolean.TRUE oder ähnliches).