java中对象的软引用,SoftReference的使用

时间:2023-01-02 09:36:08
运行java程序时,有时为了提高访问速度会将某些对象存放在内存中。但是在内存吃紧的时候我们往往需要释放一些长期没有用的对象来得到更多的内存空间。

java中给我们提供了软引用这个类java.lang.ref.SoftReference<T>

一个要引用的对象不直接引用实际的对象,而是引用java中一个特定的类SoftReference,再由SoftReference类去引用要实际引用的对象。

SoftReference类引用的对象在java运行时内存吃紧的时候会适当的回收,这样来释放内存。


public Object testSoftReference(String key){
	Object obj=null;
	Map<String, SoftReference<Object>> map=new HashMap<String, SoftReference<Object>>();
	SoftReference<Object> reference=map.get(key);
	if(reference!=null){
		obj=reference.get();
		if(obj!=null){
			return obj;
		}
	}
	obj=getObj(key);
	reference=new SoftReference<Object>(obj);
	map.put(key, reference);
	return obj;
 }


软引用在设备内存比较少的时候特别有用,比如android系统。

  一个android应用如果设计到通过网络获取图片,为了让系统更快的运行和更节省流量我们可以将已经下载下来的图片缓存起来,当第二次浏览到该图片时就可以从缓存中拿。

  缓存的方式有:一是放在系统内存中这样效率最高,二是把文件写到外部存储器上。但是就目前而言android系统的内存是非常的有限的不可能像PC机那样配置那么高的内存,而且外部存储器的容量也是有限的。

如何我们用SoftReference的方式存储在内存中是一中很好的解决方法(不止这一种)


public class ImageLoader {
	
	private Map<String,SoftReference<Bitmap>> cacheImage = new HashMap<String,SoftReference<Bitmap>>();
	
	public void loadImage(final String path,final Callback callback){
		SoftReference<Bitmap> softReference = cacheImage.get(path);
		if(softReference!=null){
			Bitmap bm = softReference.get();
			if(bm!=null){
				callback.execute(bm);
				return;
			}
		}
		new Thread(new Runnable() {
		   public void run() {
			HttpClient client = new DefaultHttpClient();
			try {
				HttpResponse response = client.execute(new HttpGet(path));
				HttpEntity entity = response.getEntity();
				byte []bs= EntityUtils.toByteArray(entity);
				final Bitmap bm = BitmapFactory.decodeByteArray(bs, 0,bs.length);
				SoftReference<Bitmap> reference = new SoftReference<Bitmap>(bm); 
				cacheImage.put(path,reference);
				callback.execute(bm);
				entity.consumeContent();
			} catch (Exception e) {
				e.printStackTrace();
			}
			}
		}).start();
	}
	
	public static abstract class Callback{
		abstract void execute(Bitmap bm);
	}
}

      个人理解还望多多指点