使用软引用和弱引用防止内存溢出_移动开发_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > 移动开发 > 使用软引用和弱引用防止内存溢出

使用软引用和弱引用防止内存溢出

 2017/4/16 5:34:32  ganchuanpu  程序员俱乐部  我要评论(0)
  • 摘要:下面以使用软引用为例来详细说明。弱引用的使用方式与软引用是类似的。假设我们的应用会用到大量的默认图片,比如应用中有默认的头像,默认游戏图标等等,这些图片很多地方会用到。如果每次都去读取图片,由于读取文件需要硬件操作,速度较慢,会导致性能较低。所以我们考虑将图片缓存起来,需要的时候直接从内存中读取。但是,由于图片占用内存空间比较大,缓存很多图片需要很多的内存,就可能比较容易发生OutOfMemory异常。这时,我们可以考虑使用软引用技术来避免这个问题发生。首先定义一个HashMap
  • 标签:使用 内存
下面以使用软引用为例来详细说明。弱引用的使用方式与软引用是类似的。 假设我们的应用会用到大量的默认图片,比如应用中有默认的头像,默认游戏图标等等,这些图片很多地方会用到。如果每次都去读取图片,由于读取文件需要硬件操作,速度较慢,会导致性能较低。所以我们考虑将图片缓存起来,需要的时候直接从内存中读取。但是,由于图片占用内存空间比较大,缓存很多图片需要很多的内存,就可能比较容易发生OutOfMemory异常。这时,我们可以考虑使用软引用技术来避免这个问题发生。 首先定义一个HashMap,保存软引用对象。 private Map<String, SoftReference<Bitmap>> imageCache = new HashMap<String, SoftReference<Bitmap>>();   再来定义一个方法,保存Bitmap的软引用到HashMap。     public void addBitmapToCache(String path) {         // 强引用的Bitmap对象         Bitmap bitmap = BitmapFactory.decodeFile(path);         // 软引用的Bitmap对象         SoftReference<Bitmap> softBitmap = new SoftReference<Bitmap>(bitmap);         // 添加该对象到Map中使其缓存         imageCache.put(path, softBitmap);     }         获取的时候,可以通过SoftReference的get()方法得到Bitmap对象。     public Bitmap getBitmapByPath(String path) {         // 从缓存中取软引用的Bitmap对象         SoftReference<Bitmap> softBitmap = imageCache.get(path);         // 判断是否存在软引用         if (softBitmap == null) {             return null;         }         // 取出Bitmap对象,如果由于内存不足Bitmap被回收,将取得空         Bitmap bitmap = softBitmap.get();         return bitmap;     }   使用软引用以后,在OutOfMemory异常发生之前,这些缓存的图片资源的内存空间可以被释放掉的,从而避免内存达到上限,避免Crash发生。 需要注意的是,在垃圾回收器对这个Java对象回收前,SoftReference类所提供的get方法会返回Java对象的强引用,一旦垃圾线程回收该Java对象之后,get方法将返回null。所以在获取软引用对象的代码中,一定要判断是否为null,以免出现NullPointerException异常导致应用崩溃。   经验分享: 到底什么时候使用软引用,什么时候使用弱引用呢? 个人认为,如果只是想避免OutOfMemory异常的发生,则可以使用软引用。如果对于应用的性能更在意,想尽快回收一些占用内存比较大的对象,则可以使用弱引用。 还有就是可以根据对象是否经常使用来判断。如果该对象可能会经常使用的,就尽量用软引用。如果该对象不被使用的可能性更大些,就可以用弱引用。 另外,和弱引用功能类似的是WeakHashMap。WeakHashMap对于一个给定的键,其映射的存在并不阻止垃圾回收器对该键的回收,回收以后,其条目从映射中有效地移除。WeakHashMap使用ReferenceQueue实现的这种机制。
class="brush:html;gutter:true;">Map<String, SoftReference<Bitmap>> iconCache=new HashMap<String, SoftReference<Bitmap>>();
if (iconCache.containsKey(iconname)) {
SoftReference<Bitmap> softref = iconCache.get(iconname);
if (softref != null) {
   Bitmap bitmap = softref.get();
   if (bitmap != null) {
       iv_book.setImageBitmap(bitmap);
   } else {
       loadimage(iv_book, book, iconname);
   }

}

} else {
    loadimage(iv_book, book, iconname);
}



iconCache.put(iconname,new SoftReference<Bitmap>(bitmap));

  

 
上一篇: Rookey.Frame v1.0极速开发平台稳定版发布 下一篇: 没有下一篇了!
发表评论
用户名: 匿名