Schwaches hashmap mit schwachen Verweisen auf die Werte?

8

Ich baue eine Android-App, bei der jede Entität eine Bitmap hat, die ihr Sprite repräsentiert. Jede Entität kann jedoch dupliziert werden (z. B. 3 Kopien von Entität asdf).

Ein Ansatz besteht darin, alle Sprites im Voraus zu laden und dann das richtige Sprite in die Konstruktoren der Entitäten einzufügen.

Ich möchte jedoch die Bitmaps langsam dekodieren, damit die Konstruktoren der Entitäten die Bitmaps decodieren. Das einzige Problem dabei ist, dass duplizierte Entitäten dieselbe Bitmap zweimal laden, indem sie den doppelten Speicher verwenden (oder n mal, wenn die Entity n mal erstellt wird).

Um das zu beheben, habe ich eine SingularBitmapFactory erstellt, die eine decodierte Bitmap in einen Hashwert speichert. Wenn dieselbe Bitmap erneut angefordert wird, wird einfach der zuvor gehashte Bitmap zurückgegeben, anstatt einen neuen zu erstellen. Das Problem dabei ist, dass die Factory eine Kopie aller Bitmaps enthält und somit niemals Müll gesammelt wird.

Wie kann man die Hashmaps am besten auf einen mit schwach referenzierten Werten umstellen? Mit anderen Worten, ich möchte eine Struktur, wo die Werte nicht GC'd werden, wenn ein anderes Objekt einen Verweis darauf enthält, aber solange kein anderes Objekt darauf verweist, kann es GC'd werden.

    
Razor Storm 15.12.2012, 03:36
quelle

3 Antworten

11

Ziemlich genau, was Sie gesagt haben - machen Sie die Bitmap (Objektseite der Karte) eine WeakReference anstelle einer Bitmap. Dann müssen Sie eine zusätzliche Überprüfung hinzufügen, um festzustellen, ob die Referenz noch gültig ist, bevor Sie sie an Ihre Entitäten zurückgeben. Hier ist eine kurze Skizze der allgemeinen Idee.

%Vor%     
iagreen 15.12.2012, 04:58
quelle
7

Alte Frage, aber ich brauchte sie heute, und basierend auf @ iagreens Antwort habe ich die Idee verallgemeinert, vielleicht ist sie für jemanden nützlich ...

%Vor%

So können Sie zum Beispiel einfach

tun %Vor%

und die Drawables werden mit Weakreferences gespeichert.

Die Methode "containsValue" wäre komplizierter zu implementieren, Sie müssten alle WeakRefs iterieren und dereferenzieren ...

    
rupps 02.09.2014 23:48
quelle
-3

Der beste Weg ist die Verwendung der WeakHashMap-Klasse, die die ganze Arbeit für Sie erledigt und keine Änderungen in Ihrem Code erfordert. Es gibt ein wirklich gutes Tutorial hier: Ссылка Es ist eher alt, aber immer noch in Ordnung. Es ist wichtig, dass die WeakHashMap einen schwachen Verweis auf den Schlüssel speichert. Das bedeutet, dass Sie nicht einfach einen konstanten String-Wert als Schlüssel verwenden können, sondern stattdessen etwas wie eine Ganzzahl verwenden und sie in einer Konstantenklasse als schwache Referenz speichern.

    
SIGKILL 15.12.2012 05:00
quelle

Tags und Links