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

MemoryCache、BaseMemoryCache以及LimitedMemoryCache。

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

  1. put(String key, Bitmap value);
  2. Bitmap get(String key);
  3. Bitmap remove(String key);
  4. Collection<String> keys();
  5. void clear();

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

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

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

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

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

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

  1. @Override
  2. public Bitmap get(String key) {
  3. Bitmap result = null;
  4. Reference<Bitmap> reference = softMap.get(key);
  5. if (reference != null) {
  6. result = reference.get();
  7. }
  8. return result;
  9. }

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

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

从变量上来看:

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

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

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

  1. public boolean put(String key, Bitmap value) {
  2. boolean putSuccessfully = false;
  3. // Try to add value to hard cache
  4. int valueSize = getSize(value);
  5. int sizeLimit = getSizeLimit();
  6. int curCacheSize = cacheSize.get();
  7. if (valueSize < sizeLimit) {
  8. while (curCacheSize + valueSize > sizeLimit) {
  9. Bitmap removedValue = removeNext();
  10. if (hardCache.remove(removedValue)) {
  11. curCacheSize = cacheSize.addAndGet(-getSize(removedValue));
  12. }
  13. }
  14. hardCache.add(value);
  15. cacheSize.addAndGet(valueSize);
  16.  
  17. putSuccessfully = true;
  18. }
  19. // Add value to soft cache
  20. super.put(key, value);
  21. return putSuccessfully;
  22. }

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

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

具体解说Android图片下载框架UniversialImageLoader之内存缓存(三)的更多相关文章

  1. 具体解说Android的图片下载框架UniversialImageLoader之磁盘缓存(一)

    沉浸在Android的开发世界中有一些年头的猴子们,预计都可以深深的体会到Android中的图片下载.展示.缓存一直是心中抹不去的痛.鄙人亦是如此.Ok,闲话不说.为了督促自己的学习.以下就逐一的挖掘 ...

  2. 具体解说Android的图片下载框架UniversialImageLoader之磁盘缓存的扩展(二)

    相对于第一篇来讲,这里讲的是磁盘缓存的延续.在这里我们主要是关注四个类.各自是DiskLruCache.LruDiskCache.StrictLineReader以及工具类Util. 接下来逐一的对它 ...

  3. Android图片载入框架最全解析(一),Glide的基本使用方法

    转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/53759439 本文同步发表于我的微信公众号.扫一扫文章底部的二维码或在微信搜索 郭 ...

  4. 毕加索的艺术——Picasso,一个强大的Android图片下载缓存库,OkHttpUtils的使用,二次封装PicassoUtils实现微信精选

    毕加索的艺术--Picasso,一个强大的Android图片下载缓存库,OkHttpUtils的使用,二次封装PicassoUtils实现微信精选 官网: http://square.github.i ...

  5. picasso_强大的Android图片下载缓存库

    tag: android pic skill date: 2016/07/09 title: picasso-强大的Android图片下载缓存库 [本文转载自:泡在网上的日子 参考:http://bl ...

  6. Andoid 更好的Android多线程下载框架

    概述 为什么是更好的Android多线程下载框架呢,原因你懂的,广告法嘛! 本篇我们我们就来聊聊多线程下载框架,先聊聊我们框架的特点: 多线程 多任务 断点续传 支持大文件 可以自定义下载数据库 高度 ...

  7. 更好的Android多线程下载框架

    /** * 作者:Pich * 原文链接:http://me.woblog.cn/ * QQ群:129961195 * Github:https://github.com/lifengsofts */ ...

  8. Android图片下载以及缓存框架

    实际开发中进行图片下载以及缓存的框架 介绍一下开发中常见图片加载框架的使用和对比一下优缺点. 1.Picasso 框架 在Android中开发,常需要从远程获取图片并显示在客户端,当然我们可以使用原生 ...

  9. picasso-强大的Android图片下载缓存库

    编辑推荐:稀土掘金,这是一个针对技术开发者的一个应用,你可以在掘金上获取最新最优质的技术干货,不仅仅是Android知识.前端.后端以至于产品和设计都有涉猎,想成为全栈工程师的朋友不要错过! pica ...

随机推荐

  1. java实现的单点登录

    摘要:单点登录(SSO)的技术被越来越广泛地运用到各个领域的软件系统当中.本文从业务的角度分析了单点登录的需求和应用领域:从技术本身的角度分析了单点登录技术的内部机制和实现手段,并且给出Web-SSO ...

  2. python_MachineLearning_感知机PLA

    感知机:线性二类分类器(linear binary classifier)   感知机(perceptron)是二类分类的线性模型,其输入为实例的特征向量,输出为实例的类别,取+1和-1二值.感知机对 ...

  3. Android(java)学习笔记192:ContentProvider使用之虚拟短信

    1.虚拟短信应用场景:   急着脱身?应付老婆(老公.男女朋友查岗)?   使用虚拟通话短信吧.您只需通过简单设置,软件就会在指定时间会模拟一个“真实”来电或短信来迷惑对方,通过“真实”的证据让对方相 ...

  4. cpio - 存取归档包中的文件

    总览 (SYNOPSIS) cpio {-o|--create} [-0acvABLV] [-C bytes] [-H format] [-M message] [-O [[user@]host:]a ...

  5. dom监听事件class

    layui.use(['layer', 'form'], function(){ var layer = layui.layer ,form = layui.form; var $ = layui.j ...

  6. 十六进制字符串转byte (无符号字符串);

    方法一: unsigned char* hexstr_to_char(const char* hexstr) { size_t len = strlen(hexstr); IF_ASSERT(len ...

  7. 打印出A到Z的所有字符,使用char和int转换

    public class Demo14{ //A到Z的所有字符,使用char和int转换 public static void main(String[] args) { for(int i = 65 ...

  8. vue多视图

    第一步   在app.vue中 <router-view class="b" name="header"> </router-view> ...

  9. swiper 旋转木马效果

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8&quo ...

  10. 中南大学2019年ACM寒假集训前期训练题集(基础题)

    先写一部分,持续到更新完. A: 寒衣调 Description 男从戎,女守家.一夜,狼烟四起,男战死沙场.从此一道黄泉,两地离别.最后,女终于在等待中老去逝去.逝去的最后是换尽一生等到的相逢和团圆 ...