使用WeakReferences有什么好处?

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)