图片处理Lrucache 缓存防止OOM

       刚才介绍了picsso框架,picasso可以放在任意类里面,只要你有context对象,可以处理图片压缩裁剪,线程,网络上也可加载,但是目前除了一个加载高清大图容易出现OOM,还有一种情况就是加载了大量的小图,同样可以出现OOM,现在要说到另一个方面缓存用来解决这个问题。无数个小图片。

1.bitmap的特点:bitmap不会被gc回收,这个时候释放资源如何释放呢?

bitmap.recycle();bitmap=null;先回收,在为空。
这样就可以手动释放回收了,因为内存的空间是有限的,bitmap又不会被回收,如果放的太多,放不下就内存溢出了。这个时候如何手动回收是不好回收的,放一张回收一张,不好操控,影响显示。
2.为了解决这个问题,可以打缓存,在内存中申请一个区域,内存的一部分,这个区域用来放图,当存不下图的时候,就把用的最少的图清除掉,在把新图放进来,如何做呢?用Arraylist放Bitmap,同时用一个int size变量来统计每张图大小方便和总大小作比较,这样就可以动态维护了,只要集合不超标,那么缓存就会溢出的,现在这个构想是不需要我们来做的,安卓为我们提供了一个Lrucacoh来处理,这种处理方式称为内存缓存,好处是短期这个图片不需要在下载了。这样速度更快了,极快提高了app的效率。这是第一级缓存
3.有时候我们会发现没有网,图片在app上还在,这是属于二级本地缓存,这是属于数据持久化,这个时候存的就是文件了,这个时候就会创建一个文件路径,把网上下下来的图片流到本地文件里去,当要加载图片的时候,先从内存缓存中拿,再从本地拿,最后在从网上拿。
4.目前存本地的少了,主要是存内存,还有网上的。因为现在网络快了,用picasso直接就可以配置缓存,也可以用Lrucaoch来解决。首先还需要了解下java的强软弱虚。这是java的一个缺陷,首先来看强引用 
XX a=new XX();这就是强引用,系统是不会回收它的,软引用是在内存不足会回收它的,软引用就是把一个强引用的对象放进一个软引用的对象里,它就会变成一个软引用了。弱引用一旦被发现就回收,虚引用会优先回收。早期做缓存就是用软引用来做的,这是在java中的,然后在安卓情况不一样,安卓中软引用也会被定时回收,这个安卓用Lrucache来做缓存。这是自己写了一个最简单的缓存工具类,当然很粗糙,建议还是使用picasso的。
public class ImageCacheutil {
    private LruCache<String,Bitmap>cache=new LruCache<String,Bitmap>(1024*1024){
        //
        @Override
        protected int sizeOf(String key, Bitmap value) {
            return value.getRowBytes()*(value.getHeight()>value.getWidth()?value.getHeight():value.getWidth());
        }
    };
    //存图,如何存呢,往缓存里边
    public void saveimg(Bitmap bitmap,String url)
    {
       cache.put(url,bitmap);
    }
    //如何取呢,获取图的时候应该有网络请求
    public Bitmap getImag(String url)
    {
        //缺网络请求加回调
         return cache.get(url);
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值