Mit WeakReferences in Java
Ich habe versucht, zu verwenden WeakReference
in meiner Android-Projekte, und ich hatte noch nie ein Erfolg. Jetzt habe ich wirklich brauchen, wie ich es bin den Umgang mit alten Geräten und ich habe, um die Erinnerung zu reinigen, so viel wie ich kann.
Sowieso, ich habe ein array, das über 1000 Liste der verschiedenen Zeichenfolgen. Ich brauche, um es zu laden, dann finden Sie einen string in es.
Dies ist, wie ich bin derzeit mit es:
String[] campaignList = context.getResources().getStringArray(R.array.campaignList);
WeakReference<String[]> weakCampaignList = new WeakReference<String[]>(campaignList);
Ist dies der richtige Weg, mit WeakReference
?
Wenn ja, dann was ich nicht verstehe ist, das array ist immer hydratisiert an String[]
und dann gebe ich es an die WeakReference
. Also das heißt ich habe 2 Flecken auf den Speicher für ein array? Oder ich bin völlig Fehlinterpretation des WeakReference
Konzept?
Eine sehr gute Quelle, die ich gefunden unter all den Ressourcen, ist dieses hier:
http://neverfear.org/blog/view/150/Strong_Soft_Weak_and_Phantom_References_Java
Edit:
Mein code funktioniert ohne Problem. Müssen nur wissen, wenn ich bin, es zu tun korrekt, in Bezug auf Leistung.
for (int i = 0; i < weakCampaignList.get().length; i++) {
Log.d(TAG,"weakCampaignList: "+weakCampaignList.get()[i]);
}
Meine Gesamte Methode
public static String getTheCampaign(String country, Context context) {
String campaign = "";
campaign = "annual_subscription_" + country;
String[] campaignList = context.getResources().getStringArray(
R.array.campaign_list);
ArrayList<WeakReference<String>> weakCampaignList = new ArrayList<WeakReference<String>>();
for (String s : campaignList) {
weakCampaignList.add(new WeakReference<String>(s));
}
if (country.equals("") || country.isEmpty()) {
campaign = "annual_subscription_us";
} else {
for (int i = 0; i < weakCampaignList.size(); i++) {
if (weakCampaignList.get(i).get().contains(campaign)) {
campaign = weakCampaignList.get(i).get();
return campaign;
}
}
}
return campaign;
}
- Befolgen Sie bitte die Java-Namenskonventionen. Es ist
weakCampaingList
undcampaingList
, nichtweak_campaing_list
undcampaingList
. Auch das Wort, das Sie wahrscheinlich suchen, ist geschrieben-Kampagne. - Feste mate. Dank
- Es ist immer noch nicht klar, was die Objekte, die Sie behalten möchten, in den Speicher und unter welchen Umständen ist es okay für Sie, um GC würde. Ohne diese Informationen, es gibt auch kaum jemand helfen können.
- oohhh ok, jetzt bin ich mit Ihnen, ich brauche zu halten, die campaignList.
- Sind Sie versuchen, zu implementieren, schwache Referenzen, oder versuchen Sie, die Verwendung schwacher Referenzen? Würden Sie implementieren müssen, um schwache Referenzen, wenn die Dalvik-VM hat nicht eine
WeakReference
Klasse für Sie zu verwenden (finde ich unwahrscheinlich), das erfordert die intime Kenntnis und die integration insbesondere mit dem garbage collector auf dem system. - Ja, ich bin zu versuchen, die
WeakReference
. In fast jedem Dokument, das ich gelesen habe, fand ich, dass jeder darauf hindeutetWeakReferences
oderSoftReferences
sind eine gute Möglichkeit, verwenden Sie für das Speicher-management. In dem link, den ich in die Frage. Jetzt bin ich mehr verwirrt. Ist gut zu verwendenWeakReference
im Android-Entwicklung? Ist es das, was Sie meinen, wenn Sie erwähnen "WeakReference-Klasse":import java.lang.ref.WeakReference;
dann ja. - Ich glaube, Sie haben Ihre Terminologie Durcheinander. Android bietet einen
WeakReference
- Implementierung, so dass Sie nicht brauchen, um Ihre eigenen. Sie können einfach verwenden Sie die eine, die bereits zur Verfügung gestellt. - also basierend auf was Sie sich beziehen, Bin ich die Umsetzung richtig? Oder bin ich wieder vom Thema abgekommen.
- ein vollständiges Beispiel finden Sie unter: javacodegeeks.com/2014/03/...
Du musst angemeldet sein, um einen Kommentar abzugeben.
In Müll gesammelt Sprachen wie Java, schwache Referenzen werden Häufig verwendet, um zu verhindern, dass statische oder langlebige Objekte verursacht Speicher nie freigegeben werden. Angenommen, Ihre Anwendung enthalten ist eine singleton-Klasse
ClipboardMonitor
gehalten, dass die Spur des letzten Dokuments, wo der Benutzer gedrückt Strg+C.In dieser Implementierung, wenn der Benutzer die Taste Strg+C und dann geschlossen das Dokument-Fenster (nicht aber die Anwendung), die
lastDocument
Feld halten würde, mit einem Verweis auf das Dokument, und der garbage collector konnte nicht reklamieren, dass der Speicher. Schwache Referenzen kann das problem zu beheben.In den folgenden geänderten code, das statische Feld
lastDocument
verwandelte sich in eine schwache Referenz, also auch wenn der Benutzer die Taste Strg+C und ein Dokument zugeordnet ist, um dieses Feld der garbage collector kann verlangen Sie das Dokument Speicher, nachdem das Dokument geschlossen wird.Diesem Beispiel wird deutlich, dass der wichtigste Punkt über die schwache Referenzen: schwache Referenzen nicht speichern Speicher wie von selbst. Vielmehr werden Sie verwendet, um eine bestimmte Art von problem, das verursachen kann, offensichtlich Speicherlecks in einer Anwendung geschrieben, die eine garbage Collection Sprache. Wenn Ihre Anwendung design nicht erfordern die Verwendung von schwachen Referenzen zu Adresse Besondere design-Einschränkungen, dann hinzufügen schwache Referenzen werden nur haben Sie eine (oder mehrere) der folgenden Folgen:
Den code in die original-Beitrag enthält keine Informationen oder Beweise, um zu bestimmen, ob oder nicht, müssen Sie die Verwendung von schwachen Referenzen, noch hat es die erforderlichen Informationen bereitzustellen, um zu zeigen, Ihre korrekte Anwendung bei der Bewältigung einer insbesondere Einschränkung Ihrer Anwendung. Die obigen Informationen sind allgemeiner Kommentar auf schwache Referenzen, die Ihnen helfen können zu verstehen, wie, um fortzufahren.
Edit: auf der Grundlage der aktualisierten Methode, die Sie geschrieben, es scheint, dass die schwachen Referenzen sind in Ihrem Fall nicht nötig. Sie sind nicht über die Vorteile, und damit mindestens Probleme 1 und 2 aus der obigen Liste. Abhängig von der jeweiligen garbage collector Durchführung, führen Sie, problem 3 (das werfen einer
NullPointerException
wenn Sie versuchen, zu nennencontains
).getTheCampaign
, diecampaignList
variable geht out of scope und der garbage collector kann wieder der Speicher.WeakReference
? Außerdem was meinst du mit " lange live-Objekt. Ich dachte, wenn ich ein Objekt machen, wenn es keinen Verweis, in der nächsten GC-Zyklus wird es zu sammeln. Ich habe eine Phobie, dass wenn ichnew
und ein Objekt machen ich werde am Ende mit, dass das Objekt nicht erfasst werden von GC. Vielen Dank für Ihre Antwort zuversuchen, diese
Müssen Sie denken über diese in Bezug auf Ihre Anforderungen zum richtigen Verhalten. Insbesondere, wenn ein einzelner string wird Müll gesammelt, und Sie versuchen, es zu finden, was wird passieren?
Wenn du gehst, um es zu verwenden, müssen Sie es testen, indem Sie stress-testing - sicherstellen, dass schwache Referenzen werden als garbage Collection. Sie wissen nicht wirklich, ob es richtig arbeitet, bis Sie das tun.
Wenn Sie keine Möglichkeit haben, neu zu laden, einzelne Einträge in der Liste, die Sie wahrscheinlich wollen, um eine einzelne WeakReference auf die gesamte Liste. Dann, Wann immer Sie brauchen, um darauf zuzugreifen, müssen Sie, um zu sehen, ob es gc ' ed, und laden Sie es, wenn so.
Sie schrieb:
Wenn Sie das Kontrollkästchen get() eine Referenz nicht null ist, speichern Sie das Ergebnis in einer Variablen zu, und verwenden Sie danach, nicht eine Sekunde get() vorausgesetzt, die Referenz ist immer noch da. Jeder einmal in einem blauen Mond, es nicht - der garbage-collector hob es in der Zwischenzeit. Wenn Sie halten eine variable mit der Referenz-Inhalte in der it, das nicht geschehen kann.
Ich würde nicht mit WeakReferences in der Produktion code, bis Sie sich wirklich sicher, dass Sie Sie verstehen.