内存优化,OOM异常处理

在加载大图片,尤其用listview或者gridview来显示大量图片时候,每次从网络获取明显是不明智的,想要快速的显示图片,最好是存在内存里面,那么问题就来了,存储图片最容易OOM了,就是内存溢出。怎么解决了?

在网上找了一个别人发的帖子,好久好久的了,上面说了一个软应用的概念,感觉可行,下面是java中引用的区别:

- 强引用 垃圾回收器不会回收, java默认引用都是强引用
- 软引用 SoftReference   在内存不够时,垃圾回收器会考虑回收
- 弱引用 WeakReference  在内存不够时,垃圾回收器会优先回收
- 虚引用 PhantomReference  在内存不够时,垃圾回收器最优先回收

果断尝试了一下(使用方式百度特别多),结果的确给我回收了,但是坑爹的创建就马上回收,继续在网上探索半天找到了一个答案:

注意: Android2.3+, 系统会优先将SoftReference的对象提前回收掉, 即使内存够用(WeakReference  与PhantomReference  也是一样)。老方法看来不行了,最后还是一个在一个视频中发现了一个方法LruCache (最近最少使用算法),

LruCache :会将内存控制在一定的大小内, 超出最大值时会自动回收, 这个最大值自己定(我一般设置为最大内存的八分之一左右),这个方法会计算当超过最大值就会删除掉最近最少使用的。我看其源代码发现其实就是一个hashMap,只是增加了一个计算删除的算法而已。下面是使用的实例代码

LruCache mMemoryCache;
public MemoryCache() {
//获取内存最大值的八分之一
int maxSize = (int) (Runtime.getRuntime().maxMemory()/8);
mMemoryCache = new LruCache(maxSize){
@Override
protected int sizeOf(String key, Bitmap value) {
//这里要返回即将存储的图片占的内存(像素点的乘积),不然默认返回的1
return value.getByteCount();
}
};
}

其存取方式和map一样的

有兴趣的可以去看看其源代码就懂了

LruCache优化内存这种方式除外,在加载图片的时候还可以适当的进行图片压缩。这些感兴趣的可以研究下,就单纯的图片加载而已个人推荐XUtils的BitmapUtil这个第三方框架,其实它的实现逻辑也是利用图片压缩,Lrucache,三级缓存等,但是人家封装的真的很好

你可能感兴趣的:(内存优化,OOM异常处理)