提到图片加载和缓存方案, 我们可能会立刻想到 Flide,Fresco 等框架, 但除了这些还有没有别的? Android 开发历史上都有哪些有名的图片加载和缓存方案呢? 它们各方面的性能对比情况怎么样? 谁更有优势? 谁占统治地位呢? 今天我们就来简单总结一下之前都有哪些框架曾经辉煌过, 现在又是那个框架的天下.
1,BitmapFun
们先来看下 BitmapFun,BitmapFun 函数库是 Android 官方教程中的一个图片加载和缓存实例, 对于简单的图片加载需求来说, 使用 BitmapFun 就够了.
它的原理很简单, 符合现在流行的图片加载和缓存方案. 在获取图片时首先从内存缓存中查找, 如未找到图片对象, 则到本地 sdCard 卡上查找, 如果还是未查到, 再去网络请求. 网络请求, 并下载成功后, 先保存原图到某个目录下, 然后再将原图根据要求进行缩放, 缩放后的图片保存成另一个图片, 方便使用.
但是讲真, 先不说 BitmapFun 性能怎样, 它使用起来确实很麻烦. 在使用前先要搞清楚 ImageWorker,BitmapWorkerTask,ImageCache,DiskLruCache,ImageResizer,ImageFetcher 等等这些类都是做什么的, 然后它们是怎样配合使用的, 所以要想用好它们有一定的学习门槛.
在早期 Android 开发中, 因为没有其它选择, 所以 BitmapFun 用的比较多, 但现在已经退出了实际项目的开发舞台.
2,Android-Universal-Image-Loader
简称, UIL 或者 ImageLoader. 这个框架老司机们应该不陌生, 它曾经是图片加载框架中的王者, Android 开发老手们都用过它.
GitHub 地址为: https://github.com/nostra13/Android-Universal-Image-Loader, 目前为止已经有超过 16.4k + 个 star, 这足以说明它曾经非常火热.
UIL 与 gilde 最大区别是可定制化, 无论线程池, 下载器, 还是 *** 都可以高度自定义.
它提供一系列配置选项, 能很好地控制图片加载和缓存的过程.
主要特征如下:
同步或异步的多线程图片加载.
高度可自定义: 线程池, 下载器,***, 内存和磁盘缓存, 图片显示选项等.
每张图片的显示支持多种自定义选项: 默认存根图片, 解码选项, Bitmap 处理和显示等.
图片可缓存在内存或者磁盘 (设备的文件系统或者 SD 卡) 上.
可实时监听图片加载流程, 包括下载进度.
UIL 还提供了大量配置方式, 如图片加载状态的回调(成功, 失败, 进行中), 加载动画等; 以及提供了移动端图片加载框架的缓存思路: 三级缓存策略 内存 - sd 卡 - 网络.
整个 UIL 库分为 ImageLoaderEngine,Cache 及 ImageDownloader,ImageDecoder,BitmapDisplayer,BitmapProcessor 五大模块, 其中 Cache 又分为 MemoryCache 和 DiskCache 两部分.
随着 google,Facebook 发布自己的图片加载和缓存框架, UIL 占的份额越来越小, 但仍有相当部分人在使用它.
3,Picasso
Picasso 是著名的 square 公司的一个开源项目, 它除了实现图片的下载和二级缓存功能, 还解决了常见的一些问题, 如, 在 adapter 中正常的处理 ImageView 回收和下载的取消问题; 使用尽量小的内存实现复杂的图像变换等问题.
整个库分为 Dispatcher,RequestHandler,Downloader,PicassoDrawable 等模块.
它具有如下优点:
自带统计监控功能, 支持图片缓存使用的监控, 包括缓存命中率, 已使用内存大小, 节省的流量等.
支持优先级处理, 选择优先级高的任务优先处理.
支持飞行模式, 并发线程数根据网络类型而变. 根据网络类型来决定最大并发数, 而不是 CPU 的核数.
将本地缓存交给 okhttp.Picasso 自己没有实现本地缓存, 而是交给了 okhttp 去实现, 这样的好处是可以通过请求 okhttp 来控制图片的过期时间.
它的使用很简单, 我们使用一行代码即可实现图片下载并渲染到 ImageView 中.
Picasso.with(context).load(url).into(imageView);
官网地址为: http://square.github.io/picasso/
GitHub 地址为: https://github.com/square/picasso
可以看到, 目前为止已经有超过 16.5k + 个 star, 略高于 UIL 的 start.
4,Fresco
Fresco 是 Facebook 开源的功能强大的图片加载和缓存函数库, 相比其他图片缓存库, Fresco 最显著的特点是具有三级缓存: 两级内存缓存和一级磁盘缓存.
主要特性如下:
渐进式地加载 JPEG 图片.
支持显示 GIF 和 webP 动画.
可扩展, 可自定义图片加载和显示.
在 Android 4.X 以上的系统上, 能将图片放在 Android 内存一个特殊的区域, 从而使得应用运行更流畅, 同时极大减低出现 OutOfMemoryError 的错误.
Fresco 可以看做成一个强大的图片加载组件. 其设计有一个叫做 image pipeline 的模块, 负责从网络, 从本地文件系统, 本地资源加载图片. 为了最大限度节省空间和 CPU 时间, 它含有 3 级缓存设计(2 级内存, 1 级文件). 还设计有一个叫做 Drawees 模块, 方便显示 loading 图, 当图片不再显示在屏幕上时, 及时地释放内存和空间占用. Fresco 支持 Android2.3(API level 9) 及其以上系统.
官网地址: https://www.fresco-cn.org/
GitHub 地址为: https://github.com/facebook/fresco
目前为止已经有超过 15.4k + 个 star.
在管理图片内存领域上有着自己一套独特的方法, 在渐进式加载, 支持 gif 等都是它与位列前茅的特性.
5,Glide
Glide 是 Google 推荐的用于 Android 平台上的图片加载和缓存函数库. 这个库被广泛应用在 Google 的开源项目中, Glide 和 Picasso 有 90% 的相似度, 只是在细节上还是存在不少区别.
用一句话介绍是: glide 是一款专注于提供流畅划动能力的 "图片加载和缓存框架"
Glide 为包含图片的滚动列表做了尽可能流畅的优化. 除了静态图片, Glide 也支持 GIF 格式图片的显示. Glide 提供了灵活的 API 可以让开发者方便地替换下载图片所用的网络函数库, 默认情况下, 它使用 HttpUrlConnection 作为网络请求模块, 开发者也可以根据自己项目的实际需求灵活使用 Google 的 Volley 或者 Square 的 OkHttp 等函数库进行替换.
整个库分为 RequestManager(请求管理器),Engine(数据获取引擎),Fetcher(数据获取器),MemoryCache(内存缓存),DiskLRUCache,Transformation(图片处理),Encoder(本地缓存存储),Registry(图片类型及解析器配置),Target(目标)等模块.
Glide 优点:
强大的缓存能力. Glide 不仅是支持图片缓存, 它支持 Gif,WebP, 缩略图, 甚至是 Video 类型格式.
支持优先级处理, 一般的框架这两项很难做到.
与 Activity/Fragment 生命周期一致, 支持 trimMemory .
支持 okhttp,Volley 扩展. Glide 默认通过 UrlConnection 获取数据, 可以配合 okhttp 或是 Volley 使用. 另外, ImageLoader,Picasso 也都支持 okhttp,Volley.
友好的内存设计. 可以缓存更小的图片, 图片默认使用 RGB565 而不是 ARGB888, 可以节省内存占用.
GitHub 址为: https://github.com/bumptech/glide
25.1k 个 star, 是图片加载类框架排名第一的框架, 遥遥领先于其它框架. google 在 2014 开发者大会上演示的 camera App 就是基于 gilde 框架开发的.
它的使用方法非常简单, 加载图片可以使用一行代码来完成.
Glide.with(context).load(url).into(imageView);
抛开 BitmapFun 不提, 我们看下 4 个框架的对比,
6. 总结
有了以上对比, 我相信大家在选择图片加载和缓存方案时, 心中已经基本有方向了.
来源: http://www.bubuko.com/infodetail-3077559.html