aho*_*der 11 java android memory-leaks weak-references bitmap
我的应用程序中有一些内存泄漏.它们都是围绕一个特定的视图集群发起的,我花了很多时间进行调整,并试图尽可能减少大量的上下文传递.这让我相信群集中使用的位图是个问题.所以我想将WeakReferences用于对视图使用的位图的所有引用.我从未使用过WeakReference,也不确定这是否是一个很好的应用程序.任何机构都可以提供有用的指示或提示吗?
Jér*_*nge 15
所以我想将WeakReferences用于对视图使用的位图的所有引用.我从未使用过WeakReference,也不确定这是否是一个很好的应用程序.任何机构都可以提供有用的指示或提示吗?
小心,这在你的情况下是危险的.当您的应用程序可能仍需要它们时,GC可以清除所有位图.
关于WeakReference的关键问题是理解与硬引用的区别.如果应用程序中没有对位图的硬引用,则允许GC以原子方式从内存中删除对象,并且所有现有的弱引用将立即指向null.在您的情况下,您不能在代码中使用弱引用.
这是解决方案的想法.创建一个容器对象,它将对所有位图保留弱引用(仅限).您的视图应始终仅使用硬引用引用位图.当视图创建位图时,它应该在容器对象中注册它.当它想要使用视图时,它应该从容器中获取硬引用.
就像那样,如果没有视图引用位图,那么GC将收集对象而没有视图的副作用,因为没有一个硬件引用它.使用弱引用对象时,最好在不再需要对象时将硬引用显式设置为null.
加成
这是解决方案的快速实现(只是为了给出一个想法):
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;
}
}
Run Code Online (Sandbox Code Playgroud)