Android LruCache简单分析

来源:互联网 发布:安卓软件交易平台 编辑:程序博客网 时间:2024/06/05 02:42

在我们的移动设备中实现缓存是一个很重要的功能,今天我们了解一下内存缓存LruCache,LruCache是一个泛型类,提供了getset方法来完成缓存的获取和添加操作,当缓存满时会移除近期使用最少的缓存对象(ps:lrucache只是把该对象从缓存中移出),然后再添加进新的缓存对象。它内部采用了一个LinkedHashMap以强引用的方式存储外界的缓存对象。这里区别一下强引用、软引用和弱引用:

强引用:直接的对象引用;

软引用:当一个对象只有软引用存在时,系统内存不足时此对象会被回收;

弱引用:当一个对象只有弱引用时,系统会随时回收此对象。

这里我们简单的实现一个图片缓存类:

publicclass ImageCache {

    private LruCache<String,Bitmap>memoryCache;

    private int maxMemory;

    private int cacheSize;

    public ImageCache(){

        maxMemory= (int)(Runtime.getRuntime().maxMemory()/1024);

        cacheSize=maxMemory/8;

        memoryCache=new LruCache<String,Bitmap>(cacheSize){

            @Override

            protected int sizeOf(String key,Bitmap bitmap) {

                returnbitmap.getRowBytes()*bitmap.getHeight()/1024;

            }

        };

    }

 

    /**

     *

     * @param key

     * @param bitmap

     */

    public void putBitmap(String key,Bitmapbitmap){

        memoryCache.put(key,bitmap);

    }

 

    /**

     *

     * @param key

     * @return

     */

    public Bitmap getBitmap(String key){

        if(null==memoryCache.get(key)){

            return  memoryCache.get(key);

        }

        return null;

    }

/**

*

*@param key

*@return

*/

public Bitmapremove(String key){

return memoryCache.remove(key);

}

}

这里我们首先获取到当前进程的最大可用内存maxMemory,并将最大缓存容量cacheSize设置为最大可用内存的1/8,然后我们实例化LruCache时只需要指定缓存空间的大小并重写sizeOf方法,该方法是用来计算缓存对象的大小,这里的单位必须和总容量的单位一致。

LruCache的源码也比较的少:我们来一起看一下源码

首先是构造方法:



这里会将我们传入的缓存大小设置给maxSize并将this.map变量实例化,我们的缓存对象就是放置在该对象中。

我们再来看我们实例化LruCache对象时重写的sizeOf方法:


可以看出默认此方法返回的对象大小是1,显示如果我们不重写该方法是不行滴。

接下来我们可以看到putget方法分别用于添加缓存对象和根据key来取缓存。


 


 

此外LruCache还提供了remove方法来根据key移除对应的缓存对象:


当然,LruCache源码中还有一些其它方法就不和大家一一的看了。大家可以自行看一下源码。

1 0
原创粉丝点击