我的应用程序中存在一些内存泄漏。它们都源于一个特定的视图集群,我花了很多时间对其进行调整并尝试尽可能减少上下文传递。这让我相信集群中使用的位图是问题所在。所以我想对视图使用的位图的所有引用使用 WeakReferences。我从未使用过 WeakReference,并且不确定这是否是一个好的应用程序。任何机构都可以提供有用的指示或提示吗?
所以我想用
所有引用的 WeakReferences
视图使用的位图。我有
从未使用过 WeakReference,也没有使用过
确定这是否是一个好的应用程序。
任何机构都可以提供帮助吗
指点或提示?
小心,这对你来说很危险。 GC 可能会删除所有位图,而您的应用程序可能仍然需要它们。
WeakReference 的关键问题是理解它与硬引用的区别。如果应用程序中不再有对位图的硬引用,则允许 GC 以原子方式从内存中删除该对象,并且所有现有的弱引用将立即指向 null。就您而言,您不能在整个代码中使用弱引用。
这是解决方案的一个想法。创建一个容器对象,它将(仅)保留对所有位图的弱引用。您的视图应始终仅引用具有硬引用的位图。当视图创建位图时,它应该将其注册到容器对象中。当它想要使用视图时,它应该从容器获取硬引用。
这样,如果没有视图引用位图,那么 GC 将收集该对象,而不会对视图产生副作用,因为没有视图对其具有硬引用。使用弱引用对象时,当不再需要该对象时,最好将硬引用显式设置为 null。
Addition
这是解决方案的快速实现(仅提供一个想法):
public class BitmapContainer {
public static class Bitmap {
private final long id;
public Bitmap(long id) { this.id = id; }
public long getId() { return id; }
public void draw() { };
}
WeakHashMap<Bitmap, WeakReference<Bitmap>> myBitmaps
= new WeakHashMap<Bitmap, WeakReference<Bitmap>>();
public void registerBitMap(Bitmap bm) {
if ( bm == null ) throw new NullPointerException();
WeakReference<Bitmap> wr = new WeakReference<Bitmap>(bm);
myBitmaps.put(bm, wr);
}
/** Method returns null if bitmap not available */
public Bitmap getBitMap(long id) {
for ( Bitmap item : myBitmaps.keySet() ) {
if ( item != null) {
if ( item.getId() == id ) {
return item;
}
}
}
return null;
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)