详细讲解Android图片下载框架UniversialImageLoader之内存缓存(三)

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

MemoryCache、BaseMemoryCache以及LimitedMemoryCache。

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

[java] view plaincopyprint?

  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。

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

[java] view plaincopyprint?

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

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

稍微的关注一下下面的方法

[java] view plaincopyprint?

  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的进一步扩展。

从变量上来看:

[java] view plaincopyprint?

  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>());

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

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

[java] view plaincopyprint?

  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. putSuccessfully = true;
  17. }
  18. // Add value to soft cache
  19. super.put(key, value);
  20. return putSuccessfully;
  21. }

很明显,在缓存图片的时候,先需要判断一下当前的图片的加入有没有超过整体的缓存的内存的尺寸的限制。如果超过,先根据不同的策略,删除优先需要删除的图片,如果合适,当前的图片插入,如果不合适,继续迭代。

时间: 2024-10-10 00:51:00

详细讲解Android图片下载框架UniversialImageLoader之内存缓存(三)的相关文章

详细讲解Android图片下载框架UniversialImageLoader之内存缓存扩展(四)

内存缓存的扩展还是蛮重要的,无论是数据结构还是具体的实现还是值得我们进行细细的品味,下面咱们就一起能品味这里面的趣味吧. 内存缓存的扩展主要学习下面的几个类:FIFOLimitedMemoryCache.FuzzyKeyMemoryCache. LargestLimitedMemoryCache.LimitedAgeMemoryCache.LRULimitedMemoryCache. LruMemoryCache.UsingFreqLimitedMemoryCache以及WeakMemoryCa

具体解说Android图片下载框架UniversialImageLoader之内存缓存(三)

前面的两篇文章着重介绍的是磁盘缓存,这篇文章主要是解说一下内存缓存.对于内存缓存.也打算分两篇文章来进行解说.在这一篇文章中,我们主要是关注三个类, MemoryCache.BaseMemoryCache以及LimitedMemoryCache. 首先我们先看一下内存缓存的接口MemoryCache. put(String key, Bitmap value); Bitmap get(String key); Bitmap remove(String key); Collection<Strin

详细讲解Android的图片下载框架UniversialImageLoader之磁盘缓存(一)

沉浸在Android的开发世界中有一些年头的猴子们,估计都能够深深的体会到Android中的图片下载.展示.缓存一直是心中抹不去的痛.鄙人亦是如此.Ok,闲话不说,为了督促自己的学习,下面就逐一的挖掘Android中还算是比较牛叉的图片处理框架UniversialImageLoader以飨读者吧! 凡事如果过于草率必将陷入泥塘不能自拔.还是按部就班的一步一步的将这个框架给啃透. 第一个要讲的是磁盘的缓存的接口DiskCache 首先看一下其中的核心的接口的代码: File getDirector

详细讲解Android的图片下载框架UniversialImageLoader之磁盘缓存的扩展(二)

相对于第一篇来讲,这里讲的是磁盘缓存的延续.在这里我们主要是关注四个类,分别是DiskLruCache.LruDiskCache.StrictLineReader以及工具类Util. 接下来逐一的对它们进行剖析.废话不多说. 首先来看一下DiskLruCache. 这个类的主要功能是什么呢?我们先来看一段类的注释: /** * A cache that uses a bounded amount of space on a filesystem. Each cache * entry has a

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

毕加索的艺术--Picasso,一个强大的Android图片下载缓存库,OkHttpUtils的使用,二次封装PicassoUtils实现微信精选 官网: http://square.github.io/picasso/ 我们在上篇OkHttp的时候说过这个Picasso,学名毕加索,是Square公司开源的一个Android图形缓存库,而且使用起来也是非常的简单,只要一行代码就轻松搞定了,你会问,为什么不介绍一下Glide?其实Glide我有时间也是会介绍的,刚好上篇我们用到了Picasso,

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

概述 为什么是更好的Android多线程下载框架呢,原因你懂的,广告法嘛! 本篇我们我们就来聊聊多线程下载框架,先聊聊我们框架的特点: 多线程 多任务 断点续传 支持大文件 可以自定义下载数据库 高度可配置,像超时时间这类 业务数据和下载数据分离 下面我们在说下该框架能实现那些的应用场景: 该框架可以很方便的下载单个文件,并且显示各种状态,包括开始下载,下载中,下载失败,删除等状态. 也可以实现常见的需要下载功能应用,比如:某某手机助手,在该应用内可以说是下载是核心功能,所以对框架的稳定性,代码

Android 图片下载

Android开发者可能会使用Universal Image Loader或者Square`s newer Picasso这些第三方的库去处理图片的加载 Universal Image Loader https://github.com/nostra13/Android-Universal-Image-Loader Square`s newer Picasso https://github.com/square/picasso Android 图片下载,布布扣,bubuko.com

Android网络通信Volley框架源码浅析(三)

尊重原创 http://write.blog.csdn.net/postedit/26002961 通过前面浅析(一)和浅析(二)的分析,相信大家对于Volley有了初步的认识,但是如果想更深入的理解,还需要靠大家多多看源码. 这篇文章中我们主要来研究一下使用Volley框架请求大量图片的原理,在Android的应用中,通过http请求获取的数据主要有三类: 1.json 2.xml 3.Image 其中json和xml的获取其实原理很简单,使用Volley获取感觉有点大财小用了,了解Volle

Android图片下载以及缓存框架

实际开发中进行图片下载以及缓存的框架 介绍一下开发中常见图片加载框架的使用和对比一下优缺点. 1.Picasso 框架 在Android中开发,常需要从远程获取图片并显示在客户端,当然我们可以使用原生HttpURLConnection和AsyncTask等操作来完成,但并不推荐,因为这样不仅需要我们编写大量的代码, 还需要处理缓存和下载管理等,最好自己封装成库或者采用第三方库: 使用HttpUrlConnection和AsyncTask实现远程图片下载: 使用HttpUrlConnection和