java中对象的软引用,SoftReference的使用
2012-08-02 23:51
507 查看
运行java程序时,有时为了提高访问速度会将某些对象存放在内存中。但是在内存吃紧的时候我们往往需要释放一些长期没有用的对象来得到更多的内存空间。
java中给我们提供了软引用这个类java.lang.ref.SoftReference<T>。
一个要引用的对象不直接引用实际的对象,而是引用java中一个特定的类SoftReference,再由SoftReference类去引用要实际引用的对象。
SoftReference类引用的对象在java运行时内存吃紧的时候会适当的回收,这样来释放内存。
软引用在设备内存比较少的时候特别有用,比如android系统。
一个android应用如果设计到通过网络获取图片,为了让系统更快的运行和更节省流量我们可以将已经下载下来的图片缓存起来,当第二次浏览到该图片时就可以从缓存中拿。
缓存的方式有:一是放在系统内存中这样效率最高,二是把文件写到外部存储器上。但是就目前而言android系统的内存是非常的有限的不可能像PC机那样配置那么高的内存,而且外部存储器的容量也是有限的。
如何我们用SoftReference的方式存储在内存中是一中很好的解决方法(不止这一种)
个人理解还望多多指点
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); } }
个人理解还望多多指点
相关文章推荐
- java中使用final关键字修饰一个变量时,是引用不能变,还是引用的对象不能变?
- Java中引用变量的使用_传引用就是传地址。因为"传地址数值"比"传对象的拷贝" 简单 。
- JAVA中Arrays.sort()使用两种方式(Comparable和Comparator接口)对对象或者引用进行排序
- java 基础--类与对象的创建,引用,static静态方法的创建与使用,static变量
- JAVA中Arrays.sort()使用两种方式(Comparable和Comparator接口)对对象或者引用进行排序
- JAVA中Arrays.sort()使用两种方式(Comparable和Comparator接口)对对象或者引用进行排序
- JAVA中Arrays.sort()使用两种方式(Comparable和Comparator接口)对对象或者引用进行排序
- Java中的引用变量和对象的“==”比较使用讲解
- Java_31_面向对象_Java程序运行的内存分析_栈_堆_引用类型的概念_属性_对象的创建和使用
- 【Java面试题】2 Java中使用final关键字修饰一个变量时,是引用不能变,还是引用的对象不能变?超详细解析
- 【Java基础】在使用@Deprecated注解时发生的对象引用变量的类型的问题
- 【Java】使用 SoftReference 软引用
- JAVA中Arrays.sort()使用两种方式(Comparable和Comparator接口)对对象或者引用进行排序
- java中使用final关键字修饰一个变量时,是引用不能变,还是引用的对象不能变?
- 使用 XStream 把 Java 对象序列化为 XML
- java中string对象中的split方法的使用
- java使用Comparator与Comparable接口对对象排序
- Java多态性详解 (父类引用子类对象)
- 高效Java06:消除过期的对象引用
- java 的深度clone,对于对象里面还包含其它对象可使用流克隆法