因此,我考虑将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); } public Bitmap getBitMap(long id) { for ( Bitmap item : myBitmaps.keySet() ) { if ( item != null) { if ( item.getId() == id ) { return item; } } } return null; }}


