我的应用程序出现问题:在我的应用中,每个activity
都有多个ImageViews
,每个ImageView
都设置了bitmap
。如果打开多个activities recursively
{1}},分配的内存将不断增加,最后 MemoryCache已满,因此我无法显示任何位图,否则应用crash
。
如果ImageView
被activity
停止,我该怎么办?我可以recycle
使用bitmap
,并在其活动恢复后重新加载位图吗?
我使用 Fresco 来处理位图加载和缓存。
答案 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()