递归地打开许多带有位图的活动

时间:2015-06-09 10:22:54

标签: android bitmap

我的应用程序出现问题:在我的应用中,每个activity都有多个ImageViews,每个ImageView都设置了bitmap。如果打开多个activities recursively {1}},分配的内存将不断增加,最后 MemoryCache已满,因此我无法显示任何位图,否则应用crash

如果ImageViewactivity停止,我该怎么办?我可以recycle使用bitmap,并在其活动恢复后重新加载位图吗?

我使用 Fresco 来处理位图加载和缓存。

1 个答案:

答案 0 :(得分:0)

使用Bitmap对象时处理内存的最佳方法是使用LruCache并将Bitmap存储在内部。 一旦您不再需要Bitmap,您就可以将其存储到缓存并进行回收,以释放尽可能多的内存。如果它存储在缓存中,您只需从缓存中获取图像。

这是我的班级处理我的缓存:

public class ImagesCache {
private  LruCache <String, Bitmap> imagesWarehouse;
private static ImagesCache cache;

public static ImagesCache getInstance() {
    if(cache == null)
        cache = new ImagesCache();
    return cache;
}

public void initializeCache() {
    final int maxMemory = (int) (Runtime.getRuntime().maxMemory() / 1024);
    final int cacheSize = maxMemory / 8;

    imagesWarehouse = new LruCache<String, Bitmap>(cacheSize) {
        protected int sizeOf(String key, Bitmap value) {
            // The cache size will be measured in kilobytes rather than number of items.
            int bitmapByteCount = value.getRowBytes() * value.getHeight();

            return bitmapByteCount / 1024;
        }};
}

public void addImageToWarehouse(String key, Bitmap value) {       
    if (imagesWarehouse != null && imagesWarehouse.get(key) == null)
        imagesWarehouse.put(key, value);
}

public Bitmap getImageFromWarehouse(String key) {
    if (key != null)
        return imagesWarehouse.get(key);
    else
        return null;
}

public void removeImageFromWarehouse(String key) {
    imagesWarehouse.remove(key);
}

public void clearCache() {
    if (imagesWarehouse != null)
        imagesWarehouse.evictAll();
}

}

请务必在应用启动时初始化缓存

cache.initializeCache()

并清除您的应用何时完成

cache.clearCache()