浅谈Android中图片的三级缓存策略

  

<强>什么是三级缓存?

  
      <李>内存缓存优,先加载,速度最快李   <李>本地缓存,次优先加载,速度快李   <李>网络缓存,最后加载,速度慢,浪费流量   
  

<强>为什么要进行三级缓存

  

三级缓存策略,最实在的意义就是减少不必要的流量消耗,增加加载速度。

  

如今的应用网络交互似乎已经必不可少,通过网络获取图片再正常不过了。但是,每次启动应用都要从网络获取图片,或者是想重复浏览一些图片的时候,每次浏览都需要网络获取,消耗的流量就多了,在如今的流量资费来说,肯定会容易影响用户数量。

  

还有就是网络加载图片,有时候会加载很慢,影响了用户体验。

  

另外从开发角度来说,位图的创建非常消耗时间和内存,可能导致频繁GC。而使用缓存策略,会更加高效地加载图,减少卡顿,从而减少读取时间。

  

而内存缓存的主要作用是防止应用重复将图片数据读取到内存当中,硬盘缓存则是防止应用重复从网络或其他地方重复下载和读取数据。

  

<强>三级缓存的原理

  
      <李>首次加载的时候通过网络加载,获取图片,然后保存到内存和SD卡中。   <李>之后运行应用程序时,优先访问内存中的图片缓存。   <李>如果内存没有,则加载本地SD卡中的图片。   
  

具体的缓存策略可以是这样的:内存作为一级缓存,本地作为二级缓存,网络加载为最后,其中,内存使用LruCache,其内部通过LinkedhashMap来持有外界缓存对象的强引用;对于本地缓存,使用DiskLruCache。加载图片的时候,首先使用LRU方式进行寻找,找不到指定内容,按照三级缓存的方式,进行本地搜索,还没有就网络加载。

  

<强>图片缓存代码实现

  

自己实现一个三级缓存的工具类并不困难。大概可以这样:

        公开课BitmapUtil {//单例模式//ぁぁ?      公共空间displayImage (ImageView img,字符串url) {   位图的位图;//内存缓存、url做唯一标识符   位图=loadBitmapFromMemoryCache (url);   如果(位图!=null) {   img.setImageBitmap(位图);   返回;   }//本地缓存   位图=loadBitmapFromDiskCache (url);   如果(位图!=null) {   img.setImageBitmap(位图);//然后将本地缓存保存到内存缓存中   返回;   }//网络缓存   位图=loadBitmapFromNet (url);   如果(位图!=null) {   img.setImageBitmap(位图);//同理将缓存保存到内存和本地中   返回;   }   }      }      之前      

详细不说了,网上有很多类似的文章可以参考。

  

关于内存缓存的实现核心基本就是获取应用最大内存,然后设置的时候用LruCache把进去。他会按照最近最少使用的算法将内存控制在一定大小内,超出的时候自动回收。

  

还有一点注意的是,一般url作为关键的时候,会用MD5算法处理一下,最后是用其MD5值作为关键的,这可能是为了避免一些特殊字符影响使用。

  

<>强关于滑移的缓存

  

事实上,现在已经很少自己封装一个三级缓存策略,在众多的图片框架中都加入缓存策略,实现起来更简单。这里以滑移为例。

  

滑翔的使用基本就是一行代码就解决了。像下面这样

     //加载本地图片   文件文件=新文件(getExternalCacheDir () + "/image.jpg ");   Glide.with(这).load(文件).into (imageView);//加载应用资源   int资源=R.drawable.image;   Glide.with(这).load(资源).into (imageView);//加载二进制流   byte []=getImageBytes形象();   Glide.with(这).load(图片).into (imageView);//加载Uri对象   Uri imageUri=getImageUri ();   Glide.with(这).load (imageUri) .into (imageView);   之前      

当然应用到项目里面最好二次封装一下。这些不是这次文章的主题。我们回到缓存上面来。

  

<强>滑翔的内存缓存

  

滑移是默认开启了内存缓存的,只要你通过滑翔加载一张图片,他就会缓存到内存中,只要他还没被从内存中清理之前,下次使用滑翔都会从内存缓存中加载。大大提升了图片加载的效率。

  

当然如果你有特殊要求,可以添加一行代码把默认开启的内存缓存关闭掉。

        Glide.with(这)   .load (url)   .skipMemoryCache(真正的)//关闭内存缓存   .into (imageView);

浅谈Android中图片的三级缓存策略