我正在构建一个 Android 应用程序,其中每个实体都有一个代表其精灵的位图。但是,每个实体都可以重复(例如,实体 asdf 可能有 3 个副本)。
一种方法是预先加载所有精灵,然后将正确的精灵放入实体的构造函数中。
但是,我想延迟解码位图,以便实体的构造函数对位图进行解码。唯一的问题是,重复的实体将加载相同的位图两次,使用 2 倍的内存(如果实体被创建 n 次,则加载 n 次)。
为了解决这个问题,我构建了一个 SingularBitmapFactory ,它将解码后的位图存储到哈希中,如果再次请求相同的位图,将简单地返回之前哈希的位图,而不是构建新的位图。但问题是工厂保存了所有位图的副本,因此永远不会被垃圾收集。
将哈希图切换为具有弱引用值的哈希图的最佳方法是什么?换句话说,我想要一个结构,其中如果任何其他对象持有对它的引用,则值不会被 GC 处理,但只要没有其他对象引用它,那么它就可以被 GC 处理。
几乎就是你所说的——使位图(地图的对象侧)成为弱引用而不是位图。然后,您必须添加额外的检查,以查看引用在将其传回实体之前是否仍然有效。这是总体思路的快速概述。
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;
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)