弱参考值弱散列表?

我正在build立一个Android应用程序,其中每个实体都有一个代表其精灵的位图。 但是,每个实体可以被复制(例如,可能有3个实体asdf副本)。

一种方法是先加载所有的精灵,然后把正确的精灵放在实体的构造函数中。

但是,我想懒散解码位图,以便实体的构造函数将解码位图。 唯一的问题是重复的实体会使用两倍的内存来载入相同的位图(如果实体创build了n次,则重复n次)。

为了解决这个问题,我构build了一个SingularBitmapFactory,它将一个解码的Bitmap存储到一个散列表中,如果再次询问相同的位图,则会简单地返回之前散列的一个,而不是构build一个新的。 但是问题在于,工厂拥有所有位图的副本,因此不会收集垃圾。

将hashmap转换为弱引用值的最好方法是什么? 换句话说,我想要一个结构,如果任何其他对象持有对它的引用,值不会被GC'd,但只要没有其他对象引用它,那么它可以GC'd。

Solutions Collecting From Web of "弱参考值弱散列表?"

几乎你所说的 – 使Bitmap(地图的对象一侧)成为一个WeakReference而不是一个Bitmap。 然后,您必须添加一个额外的检查,以确定引用是否仍然有效,然后将其传递回您的实体。 这是一般想法的简要概述。

public class SingularBitmapFactory { private HashMap <String, WeakReference<Bitmap>> cache = new HashMap<String, WeakReference<Bitmap>>(); public Bitmap getBitmap(String key) { Bitmap image = null; WeakReference<Bitmap> ref = cache.get(key); if(ref != null) { image = ref.get(); } if(image == null) { // Load image here ... cache.put(key, new WeakReference<Bitmap>(image)); } return image; } } 

老问题,但今天我需要这个,基于@ iagreen的回答,我已经概括了这个想法,也许它对于某个人来说很方便。

 public static class WeakValueHashMap<K,V> { private HashMap<K,WeakReference<V>> mDatabase=new HashMap<K, WeakReference<V>>(); public V get(K key) { WeakReference<V> weakRef=mDatabase.get(key); if (weakRef==null) return null; V result=weakRef.get(); if (result==null) { // edge case where the key exists but the object has been garbage collected // we remove the key from the table, because tables are slower the more // keys they have (@kisp's comment) mDatabase.remove(key); } return result; } public void put(K key, V value) { mDatabase.put(key, new WeakReference<V>(value)); } } 

所以你可以举个例子

  private WeakValueHashMap<String,Drawable> mTextDrawables=new WeakValueHashMap<String,Drawable>(); 

Drawables将被存储在Weakreferences

方法“containsValue”将是更棘手的实现,你必须迭代和取消引用所有的WeakRefs …

最好的方法是使用WeakHashMap类,它为您完成所有工作,并且不需要对代码进行任何更改。 有一个非常好的教程在这里: http ://weblogs.java.net/blog/2006/05/04/understanding-weak-references它相当古老,但仍然没问题。 WeakHashMap存储关键的弱引用是很重要的。 这意味着你不能只使用一个常量string值作为键,而是使用像Integer这样的东西,并把它作为一个弱引用存储在常量类中。