android中使用SoftRefrence解决Bitmap过大内存溢出问题

本文介绍了一种解决Android应用程序中图片加载导致内存溢出的方法。通过使用软引用结合硬引用缓存机制,实现了图片的有效管理和高效加载,避免了因图片占用内存过大而导致的应用崩溃。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

之前做一个手机展示多张图片的项目,做了一个异步加载图片并显示的独立控件,经常遇到报这种错误:java.lang.OutOfMemoryError: bitmap size exceeds VM budget,这是因为,android系统中读取位图Bitmap时.分给虚拟机中图片的堆栈大小只有8M。所以不管我使用了SD卡缓存图片,还是使用了bitmap.recycle()进行内存回收,但在控件多次加载后,还是经常会遇到这个内存溢出的问题。后来使用软引用(SoftRefrence)来进行内存缓存,这一问题得以解决。程序片段如下:

private final static int HARD_CACHE_CAPACITY = 30;
/**
 * 缓存bitmap至内存
 */
private final HashMap<String, Bitmap> mHardBitmapCache = new LinkedHashMap<String, Bitmap>(HARD_CACHE_CAPACITY/ 2, 0.75f, true) {
	
	@Override 
	protected boolean removeEldestEntry(LinkedHashMap.Entry<String, Bitmap> eldest) { 
	    if (size() >HARD_CACHE_CAPACITY) { 
	       //当map的size大于30时,把最近不常用的key放到mSoftBitmapCache中,从而保证mHardBitmapCache的效率 
	       mSoftBitmapCache.put(eldest.getKey(), new SoftReference<Bitmap>(eldest.getValue())); 
	       return true; 
	    } else 
	       return false; 
	}  
 
}; 

/** 
*当mHardBitmapCache的key大于30的时候,会根据LRU算法把最近没有被使用的key放入到这个缓存中。 
*Bitmap使用了SoftReference,当内存空间不足时,此cache中的bitmap会被垃圾回收掉 
*/ 
private final static ConcurrentHashMap<String, SoftReference<Bitmap>> mSoftBitmapCache = new ConcurrentHashMap<String,SoftReference<Bitmap>>(HARD_CACHE_CAPACITY / 2);

/** 
* 从缓存中获取图片 
*/ 
private Bitmap getBitmapFromCache(String name) { 
	// 先从mHardBitmapCache缓存中获取 
	synchronized (mHardBitmapCache) { 
	    final Bitmap bitmap = mHardBitmapCache.get(name); 
	    if (bitmap != null) { 
		//如果找到的话,把元素移到linkedhashmap的最前面,从而保证在LRU算法中是最后被删除 
		mHardBitmapCache.remove(name); 
		mHardBitmapCache.put(name,bitmap); 
		return bitmap; 
	    } 
	} 
	//如果mHardBitmapCache中找不到,到mSoftBitmapCache中找 
	SoftReference<Bitmap>bitmapReference = mSoftBitmapCache.get(name); 
	if (bitmapReference != null) { 
	    final Bitmap bitmap =bitmapReference.get(); 
	    if (bitmap != null) { 
		return bitmap; 
	    } else { 
		mSoftBitmapCache.remove(name); 
	    } 
	} 
	return null; 
}

/** 
* 显示图片 
* @param name 图片名称
*/ 
private void show(String name){
	ImageView image = new ImageView(act);
	image.setImageBitmap(getBitmapFromCache(name));
}

使用了上面的缓存后,图片展示速度提高了,而且不再出现内存溢出的问题了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值