Android中的缓存策略

来源:互联网 发布:张议潮 知乎 编辑:程序博客网 时间:2024/05/29 13:49

         今天给大家介绍一下Android中的缓存策略,说起缓存大家应该都有所听说,二级缓存,三级缓存之类的。缓存策略在Android中有着广泛的使用场景,尤其是图片加载这个场景下,缓存策略是非常重要的。为什么要这么说呢,Android设备大多是移动设备,多以使用数据流量为主,数据流量又是收费的,为了在应用的使用中并不过多的消耗用户的数据流量。使用缓存策略可以很好的缓解流量消耗的问题。


        先来介绍一下今天要讲的缓存策略,有时又被大家称作三级缓存。那么有哪三级呢,给大家介绍一下流程:

当程序第一次从网络加载图片时,就将其缓存到存储设备的磁盘中,有时为了更好的用户体验,往往还会把图片在内存中缓存一份。这样,当程序再次想要请求图片时,它会先到内存中去获取,如果内存中没有就去存储设备的磁盘中去获取,如果存储设备中也没有的话,那就再从网络上进行下载。因为内存中加载图片要比在存储设备中加载图片快。所以这样不但提高了程序的效率也为用户节省了不必要的流量消耗。


       通过上面的流程,大家应该知道三级缓存时哪三级了吧,分别是内存,存储设备磁盘,网络。一般来说在缓存策略中需要包括缓存的添加、获取和删除。因为不管是内存缓存还是设备缓存,它们的缓存大小总是有限制的,因为内存和SD卡等有着容量的限制,所以我们在容量快满时,需要删除一些旧的缓存对象,那么我们怎么知道我们应该删除哪些呢。我们使用到了一种缓存算法LRU (LeastRecentlyUsed),最近最少使用算法。它的核心思想是当缓存区容量满时,优先删除那么最近很少使用的缓存对象。

  

        采用Lru算法的缓存有两种,一种是LruCache,用于实现内存的缓存;一种是DiskLruCache,实现存储设备磁盘的缓存。我们接下来按照缓存的创建、添加、删除和获取对它们进行一一介绍。


一、LruCache


        LruCache是Android3.1所提供的一个缓存类,如果要在3.1之前使用的话需要使用support-v4兼容包。

        LruCache是一个泛型类。它的内部采用的是一个LinkedHashMap以强引用的方式存储外界的缓存资源。其提供了get和put方法来完成缓存的获取和添加操作。当缓存满时,LruCache会移除较早使用的缓存对象,然后添加新的缓存对象进来。    

       先来介绍一下LruCache的创建过程:

   //获得内存的总容量大小,单位KB        int maxMemory= (int) (Runtime.getRuntime().maxMemory()/1024);        //内存缓存区大小为内存总空间的1/8        int cacheSize=maxMemory/8;        LruCache<String,Bitmap> mMemoryCache=new LruCache<String,Bitmap>(cacheSize){            //重写sizeOf返回Bitmap对象的大小            @Override            protected int sizeOf(String key, Bitmap bitmap) {                return bitmap.getRowBytes()*bitmap.getHeight()/1024;            }                                    //entryRemoved方法在旧缓存被移除时被调用            @Override            protected void entryRemoved(boolean evicted, String key, Bitmap oldValue, Bitmap newValue) {                super.entryRemoved(evicted, key, oldValue, newValue);                //可以在其中完成一些资源的回收            }        };

上面的程序,只需要提供缓存的总容量大小和重写sizeOf方法即可,其他的详细信息请看上面代码注释。


        除了LruCache的创建以外还有缓存的添加和获取,这也很简单。

        从LruCache中获取一个缓存对象,代码如下:

        mMemoryCache.get(key);

向LruCache中添加一个缓存对象,代码如下:

        mMemoryCache.put(key,bitmap);

LruCache还可以通过remove方法删除一个指定的缓存对象,只需要指定key即可。


二、DiskLruCache


DiskLruCache用于实现存储设备磁盘上的缓存,他通过将缓存对象写入文件系统从而实现缓存的效果。


1.DiskLruCache的创建


DiskLruCache并不能通过构造方法来创建,它提供的open方法用于创建自身,如下:





1 0
原创粉丝点击