zoukankan      html  css  js  c++  java
  • 具体解说Android图片下载框架UniversialImageLoader之内存缓存(三)

         前面的两篇文章着重介绍的是磁盘缓存,这篇文章主要是解说一下内存缓存。对于内存缓存。也打算分两篇文章来进行解说。在这一篇文章中,我们主要是关注三个类,

    MemoryCache、BaseMemoryCache以及LimitedMemoryCache。

        首先我们先看一下内存缓存的接口MemoryCache。

    put(String key, Bitmap value);
    Bitmap get(String key);
    Bitmap remove(String key);
    Collection<String> keys();
    void clear();

    从上面能够看出,总体的接口的设计分为5个方法。1、存入真正的Bitmap  2、通过键获取Bitmap  3、通过键删除Bitmap  4、迭代获取全部的键的集合  5、清空内存的缓存。


     接下来我们看实现内存缓存的接口的抽象类BaseMemoryCache。

    与前面的文章一样,还是先从变量入手。

    /** Stores not strong references to objects */
    	private final Map<String, Reference<Bitmap>> softMap = Collections.synchronizedMap(new HashMap<String, Reference<Bitmap>>());

    正如所说的那样。这个变量是存储非强引用的对象。

    略微的关注一下以下的方法

    @Override
    	public Bitmap get(String key) {
    		Bitmap result = null;
    		Reference<Bitmap> reference = softMap.get(key);
    		if (reference != null) {
    			result = reference.get();
    		}
    		return result;
    	}

    通过键获取软引用中的数值Bitmap。


    最后我们来看一下有限内存缓存空间的缓存类LimitedMemoryCache,从继承关系上来看。它是对BaseMemoryCache的进一步扩展。

    从变量上来看:

    private static final int MAX_NORMAL_CACHE_SIZE_IN_MB = 16;
    private static final int MAX_NORMAL_CACHE_SIZE = MAX_NORMAL_CACHE_SIZE_IN_MB * 1024 * 1024;
    private final int sizeLimit;
    private final AtomicInteger cacheSize;
    private final List<Bitmap> hardCache = Collections.synchronizedList(new LinkedList<Bitmap>());

    从变量的定义来看,包含最大的缓存的限制,当前的缓存的尺寸以及强引用对象的集合。

    拿当中的对象的存储的方法来分析一下:

    public boolean put(String key, Bitmap value) {
    		boolean putSuccessfully = false;
    		// Try to add value to hard cache
    		int valueSize = getSize(value);
    		int sizeLimit = getSizeLimit();
    		int curCacheSize = cacheSize.get();
    		if (valueSize < sizeLimit) {
    			while (curCacheSize + valueSize > sizeLimit) {
    				Bitmap removedValue = removeNext();
    				if (hardCache.remove(removedValue)) {
    					curCacheSize = cacheSize.addAndGet(-getSize(removedValue));
    				}
    			}
    			hardCache.add(value);
    			cacheSize.addAndGet(valueSize);
    
    			putSuccessfully = true;
    		}
    		// Add value to soft cache
    		super.put(key, value);
    		return putSuccessfully;
    	}

    非常明显,在缓存图片的时候。先须要推断一下当前的图片的增加有没有超过总体的缓存的内存的尺寸的限制。假设超过。先依据不同的策略。删除优先须要删除的图片,假设合适,当前的图片插入,假设不合适。继续迭代。


    Ok,关于图片的内存缓存的第一篇先说到这里,后面会继续分析。希望对大家有所帮助哦~




  • 相关阅读:
    装饰器函数
    二分查找
    jmter 二次开发 IDEA 项目5.1
    python 测试框架nose
    pycharm 参数、快捷键、调试模式
    IDea 工具debug模式详细使用说明
    MySQL zip安装
    adb 设备命令
    兰亭集序 王羲之
    adb 命令实用
  • 原文地址:https://www.cnblogs.com/zhchoutai/p/6884454.html
Copyright © 2011-2022 走看看