您的位置:首页 > 移动开发 > Android开发

android加载大量图片内存溢出的三种解决办法

2016-02-27 00:00 591 查看
摘要: android 图片 内存管理

方法一:
在从网络或本地加载图片的时候,只加载缩略图。

/**

* 按照路径加载图片

* @param path 图片资源的存放路径

* @param scalSize 缩小的倍数

* @return

*/

public static Bitmap loadResBitmap(String path, int scalSize) {

BitmapFactory.Options options = new BitmapFactory.Options();

options.inJustDecodeBounds = false;

options.inSampleSize = scalSize;

Bitmap bmp = BitmapFactory.decodeFile(path, options);

return bmp;

}

这个方法的确能够少占用不少内存,可是它的致命的缺点就是,因为加载的是缩略图,所以图片失真比较严重,对于对图片质量要求很高的应用,可以采用下面的方法。
方法二:
运用JAVA的软引用,进行图片缓存,将经常需要加载的图片,存放在缓存里,避免反复加载。
关于软引用(SoftReference)的详细说明,请参看http://www.auyou.cn/club/clubbbsinfo-9255.html。下面是我写的一个图片缓存的工具类。

/**

*

* @author larson.liu

* 该类用于图片缓存,防止内存溢出

*/

public class BitmapCache {

static * BitmapCache cache;

/** 用于Chche内容的存储*/

* Hashtable bitmapRefs;

/** 垃圾Reference的队列(所引用的对象已经被回收,则将该引用存入队列中)*/

* ReferenceQueue q;

/**

* 继承SoftReference,使得每一个实例都具有可识别的标识。

*/

* class BtimapRef extends SoftReference {

* Integer _key = 0;

public BtimapRef(Bitmap bmp, ReferenceQueue q, int key) {

super(bmp, q);

_key = key;

}

}

* BitmapCache() {

bitmapRefs = new Hashtable();

q = new ReferenceQueue();

}

/**

* 取得缓存器实例

*/

public static BitmapCache getInstance() {

if (cache == null) {

cache = new BitmapCache();

}

return cache;

}

/**

* 以软引用的方式对一个Bitmap对象的实例进行引用并保存该引用

*/

* void addCacheBitmap(Bitmap bmp, Integer key) {

cleanCache();// 清除垃圾引用

BtimapRef ref = new BtimapRef(bmp, q, key);

bitmapRefs.put(key, ref);

}

/**

* 依据所指定的drawable下的图片资源ID号(可以根据自己的需要从网络或本地path下获取),重新获取相应Bitmap对象的实例

*/

public Bitmap getBitmap(int resId, Context context) {

Bitmap bmp = null;

// 缓存中是否有该Bitmap实例的软引用,如果有,从软引用中取得。

if (bitmapRefs.containsKey(resId)) {

BtimapRef ref = (BtimapRef) bitmapRefs.get(resId);

bmp = (Bitmap) ref.get();

}

// 如果没有软引用,或者从软引用中得到的实例是null,重新构建一个实例,

// 并保存对这个新建实例的软引用

if (bmp == null) {

bmp = BitmapFactory.decodeResource(context.getResources(), resId);

this.addCacheBitmap(bmp, resId);

}

return bmp;

}

* void cleanCache() {

BtimapRef ref = null;

while ((ref = (BtimapRef) q.poll()) != null) {

bitmapRefs.remove(ref._key);

}

}

// 清除Cache内的全部内容

public void clearCache() {

cleanCache();

bitmapRefs.clear();

System.gc();

System.runFinalization();

}

}

在程序代码中调用该类:
imageView.setImageBitmap(bmpCache.getBitmap(R.drawable.kind01, this));
这样当你的imageView需要来回变换背景图片时,就不需要再重复加载。
方法三:
及时销毁不再使用的Bitmap对象。
if (bitmap != null && b!itmap.isRecycled()){
bitmap.recycle();
bitmap = null; // recycle()是个比较漫长的过程,设为null,然后在最后调用System.gc(),效果能好很多
}
System.gc();
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息