细节决定成败----Android应用程序的优化(二)

房东的猫 提交于 2020-03-02 06:08:16

本文章主要从软引用和弱引用的角度探讨Bitmap的内存优化。

Java从JDK1.2之后就将对象的引用分为4个级别:强引用、软引用、弱引用、虚引用。具体的概念不详述了。

软引用:当内存空间足够的时候,GC就不会回收它,内存空间不足了,就会回收。

弱引用:GC工作过程中,一旦发现了弱引用对象,不管内存足够与否,都会回收它的内存。

所以,从上述可以看出,软引用和弱引用的根本区别在于:只具有弱引用的对象拥有更短暂的生命周期,可能随时被回收。

当缓存大量的Bitmap时,比较容易造成OOM,所以可以考虑使用软引用技术来避免这个问题的发生。

//首先定义一个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.add(path, softBitmap);
}

//获取缓存对象
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;
}

使用软引用之后,在OOM异常发生之前,这些缓存的图片资源空间都会被释放掉,从而可以避免程序因为OOM而Crash。

什么时候使用软引用,什么时候使用弱引用?

建议:如果只想避免OOM,则使用软引用;如果该对象经常被使用,则使用软引用;如果想尽快回收一些占用内存比较大的对象,则使用弱引用;

百度重口电影吧第一资源论坛-豚鼠湾www.tunshus.com

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!