图片缓存技术:在很多情况下,(比如使用ListView, GridView 或者 ViewPager 这样的组件), 屏幕上显示的图片可以通过滑动屏幕等事件不断地增加,最终导致OOM。这个时候,使用内存缓存技术可以很好的解决这个问题,它可以让组件快速地重新加载和处理图片。下面我们就来看一看如何使用内存缓存技术来对图片进行缓存,从而让你的应用程序在加载很多图片的时候可以提高响应速度和流畅性。
内存缓存技术对那些大量占用应用程序宝贵内存的图片提供了快速访问的方法。其中最核心的类是LruCache (此类在android-support-v4的包中提供) 。这个类非常适合用来缓存图片,它的主要算法原理是把最近使用的对象用强引用存储在 LinkedHashMap 中,并且把最近最少使用的对象在缓存值达到预设定值之前从内存中移除。
四大图片缓存基本信息
- Universal ImageLoader 是很早开源的图片缓存,在早期被很多应用使用。
- Picasso 是 Square 开源的项目,且他的主导者是 JakeWharton,所以广为人知。
- Glide 是 Google 员工的开源项目,被一些 Google App 使用,不过目前国内资料不多。Glide,这个库被广泛的运用在google的开源项目中。直接使用ImageView即可,无需初始化,极简的API,丰富的拓展,链式调用。直接使用ImageView即可,无需初始化,极简的API,丰富的拓展,链式调用。Glide加载的大小和ImageView的大小是一致的,因为Glide可以自动计算出任意情况下的ImageView大小。
- Fresco 是 Facebook 在今年上半年开源的图片缓存,主要特点包括:
-
- (1) 两个内存缓存加上 Native 缓存构成了三级缓存;
- (2) 支持流式,可以类似网页上模糊渐进式显示图片
- (3) 对多帧动画图片支持更好,如 Gif、WebP;
- 鉴于 Fresco 还没发布正式的 1.0 版本,后面对比不包括 Fresco,以后有时间再加入对比
(一)、基本概念
在正式对比前,先了解几个图片缓存通用的概念:
(1) RequestManager:请求生成和管理模块
(2) Engine:引擎部分,负责创建任务(获取数据),并调度执行
(3) GetDataInterface:数据获取接口,负责从各个数据源获取数据。
比如 MemoryCache 从内存缓存获取数据、DiskCache 从本地缓存获取数据,下载器从网络获取数据等。
(4) Displayer:资源(图片)显示器,用于显示或操作资源。
比如 ImageView,这几个图片缓存都不仅仅支持 ImageView,同时支持其他 View 以及虚拟的 Displayer 概念。
(5) Processor 资源(图片)处理器
负责处理资源,比如旋转、压缩、截取等。
以上概念的称呼在不同图片缓存中可能不同,比如 Displayer 在 ImageLoader 中叫做 ImageAware,在 Picasso 和 Glide 中叫做 Target。
(二)、共同优点
1. 使用简单
都可以通过一句代码可实现图片获取和显示。
2. 可配置度高,自适应程度高
图片缓存的下载器(重试机制)、解码器、显示器、处理器、内存缓存、本地缓存、线程池、缓存算法等大都可轻松配置。
自适应程度高,根据系统性能初始化缓存配置、系统信息变更后动态调整策略。
比如根据 CPU 核数确定最大并发数,根据可用内存确定内存缓存大小,网络状态变化时调整最大并发数等。
3. 多级缓存
都至少有两级缓存、提高图片加载速度。
4. 支持多种数据源
支持多种数据源,网络、本地、资源、Assets 等
5. 支持多种 Displayer
不仅仅支持 ImageView,同时支持其他 View 以及虚拟的 Displayer 概念。
其他小的共同点包括支持动画、支持 transform 处理、获取 EXIF 信息等。