Android 使用位图递归打开许多活动
我的应用程序有一个问题:在我的应用程序中,每个活动都有几个ImageView,每个ImageView都设置了一个位图。如果递归打开许多活动,分配的内存将不断增加,最后MemoryCache已满,因此我无法显示任何位图,否则应用程序将崩溃 对于活动已停止的ImageView,我可以做什么?我是否可以回收其位图,并在其活动恢复后重新加载位图Android 使用位图递归打开许多活动,android,bitmap,Android,Bitmap,我的应用程序有一个问题:在我的应用程序中,每个活动都有几个ImageView,每个ImageView都设置了一个位图。如果递归打开许多活动,分配的内存将不断增加,最后MemoryCache已满,因此我无法显示任何位图,否则应用程序将崩溃 对于活动已停止的ImageView,我可以做什么?我是否可以回收其位图,并在其活动恢复后重新加载位图 我正在使用Fresco处理位图加载和缓存。在使用位图对象时处理内存的最佳方法是使用LruCache并将位图存储在内存中。 一旦您不再需要位图,您可以将其存储到缓
我正在使用Fresco处理位图加载和缓存。在使用位图对象时处理内存的最佳方法是使用LruCache并将位图存储在内存中。 一旦您不再需要位图,您可以将其存储到缓存中并回收,以释放尽可能多的内存。如果它存储在缓存中,您只需从缓存中获取图像 这是我处理缓存的班级:
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.clearCache()
换句话说:我在使用位图时遇到了OOMException,但我试图表现得更聪明,没有提到这一点,因为这样的问题会被标记为duplicate@SyedRaza Mehdi我想知道的是:对于那些活动已停止的位图,我能做些什么,例如活动A启动活动B,现在,A已停止,无法看到。在这种情况下,我可以为A的ImageView设置空位图,并在A返回时加载位图。我是新来的,对不起,我的英语很差,我正在做这项工作。我的问题是:如何处理那些活动被停止的位图例如,它的活动开始另一个活动
cache.clearCache()