图片加载 川长思鸟来 2022-06-08 07:30 292阅读 0赞 # [Android四大图片缓存(Imageloader,Picasso,Glide,Fresco)原理、特性对比][Android_Imageloader_Picasso_Glide_Fresco] # ### 四大图片缓存基本信息 ### id="iframe\_0.18343722284771502" scrolling="no"> Universal ImageLoader 是很早开源的图片缓存,在早期被很多应用使用。 Picasso 是 Square 开源的项目,且他的主导者是 JakeWharton,所以广为人知。 Glide 是 Google 员工的开源项目,被一些 Google App 使用,在去年的 Google I/O 上被推荐,不过目前国内资料不多。 Fresco 是 Facebook 在今年上半年开源的图片缓存,主要特点包括: (1) 两个内存缓存加上 Native 缓存构成了三级缓存 (2) 支持流式,可以类似网页上模糊渐进式显示图片 (3) 对多帧动画图片支持更好,如 Gif、WebP 鉴于 Fresco 还没发布正式的 1.0 版本,同时一直没太多时间熟悉 Fresco 源码,后面对比不包括 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 信息等。 ### 四、ImageLoader 设计及优点 ### id="iframe\_0.42094396194443107" scrolling="no"> #### 1. 总体设计及流程 #### 上面是 ImageLoader 的总体设计图。整个库分为 ImageLoaderEngine,Cache 及 ImageDownloader,ImageDecoder,BitmapDisplayer,BitmapProcessor 五大模块,其中 Cache 分为 MemoryCache 和 DiskCache 两部分。 简单的讲就是 ImageLoader 收到加载及显示图片的任务,并将它交给 ImageLoaderEngine,ImageLoaderEngine 分发任务到具体线程池去执行,任务通过 Cache 及 ImageDownloader 获取图片,中间可能经过 BitmapProcessor 和 ImageDecoder 处理,最终转换为Bitmap 交给 BitmapDisplayer 在 ImageAware 中显示。 #### 2. ImageLoader 优点 #### **(1) 支持下载进度监听** **(2) 可以在 View 滚动中暂停图片加载** 通过 PauseOnScrollListener 接口可以在 View 滚动中暂停图片加载。 **(3) 默认实现多种内存缓存算法** 这几个图片缓存都可以配置缓存算法,不过 ImageLoader 默认实现了较多缓存算法,如 Size 最大先删除、使用最少先删除、最近最少使用、先进先删除、时间最长先删除等。 **(4) 支持本地缓存文件名规则定义** ### 五、Picasso 设计及优点 ### id="iframe\_0.3995217881165445" scrolling="no"> #### 1. 总体设计及流程 #### 上面是 Picasso 的总体设计图。整个库分为 Dispatcher,RequestHandler 及 Downloader,PicassoDrawable 等模块。 Dispatcher 负责分发和处理 Action,包括提交、暂停、继续、取消、网络状态变化、重试等等。 简单的讲就是 Picasso 收到加载及显示图片的任务,创建 Request 并将它交给 Dispatcher,Dispatcher 分发任务到具体 RequestHandler,任务通过 MemoryCache 及 Handler(数据获取接口) 获取图片,图片获取成功后通过 PicassoDrawable 显示到 Target 中。 需要注意的是上面 Data 的 File system 部分,Picasso 没有自定义本地缓存的接口,默认使用 http 的本地缓存,API 9 以上使用 okhttp,以下使用 Urlconnection,所以如果需要自定义本地缓存就需要重定义 Downloader。 #### 2. Picasso 优点 #### **(1) 自带统计监控功能** 支持图片缓存使用的监控,包括缓存命中率、已使用内存大小、节省的流量等。 **(2) 支持优先级处理** 每次任务调度前会选择优先级高的任务,比如 App 页面中 Banner 的优先级高于 Icon 时就很适用。 **(3) 支持延迟到图片尺寸计算完成加载** **(4) 支持飞行模式、并发线程数根据网络类型而变** 手机切换到飞行模式或网络类型变换时会自动调整线程池最大并发数,比如 wifi 最大并发为 4, 4g 为 3,3g 为 2。 这里 Picasso 根据网络类型来决定最大并发数,而不是 CPU 核数。 **(5) “无”本地缓存** 无”本地缓存,不是说没有本地缓存,而是 Picasso 自己没有实现,交给了 Square 的另外一个网络库 okhttp 去实现,这样的好处是可以通过请求 Response Header 中的 Cache-Control 及 Expired 控制图片的过期时间。 ### 六、Glide 设计及优点 ### id="iframe\_0.4771609485615045" scrolling="no"> #### 1. 总体设计及流程 #### 上面是 Glide 的总体设计图。整个库分为 RequestManager(请求管理器),Engine(数据获取引擎)、 Fetcher(数据获取器)、MemoryCache(内存缓存)、DiskLRUCache、Transformation(图片处理)、Encoder(本地缓存存储)、Registry(图片类型及解析器配置)、Target(目标) 等模块。 简单的讲就是 Glide 收到加载及显示资源的任务,创建 Request 并将它交给RequestManager,Request 启动 Engine 去数据源获取资源(通过 Fetcher ),获取到后 Transformation 处理后交给 Target。 Glide 依赖于 DiskLRUCache、GifDecoder 等开源库去完成本地缓存和 Gif 图片解码工作。 #### 2. Glide 优点 #### **(1) 图片缓存->媒体缓存** Glide 不仅是一个图片缓存,它支持 Gif、WebP、缩略图。甚至是 Video,所以更该当做一个媒体缓存。 **(2) 支持优先级处理** **(3) 与 Activity/Fragment 生命周期一致,支持 trimMemory** Glide 对每个 context 都保持一个 RequestManager,通过 FragmentTransaction 保持与 Activity/Fragment 生命周期一致,并且有对应的 trimMemory 接口实现可供调用。 **(4) 支持 okhttp、Volley** Glide 默认通过 UrlConnection 获取数据,可以配合 okhttp 或是 Volley 使用。实际 ImageLoader、Picasso 也都支持 okhttp、Volley。 **(5) 内存友好** ① Glide 的内存缓存有个 active 的设计 从内存缓存中取数据时,不像一般的实现用 get,而是用 remove,再将这个缓存数据放到一个 value 为软引用的 activeResources map 中,并计数引用数,在图片加载完成后进行判断,如果引用计数为空则回收掉。 ② 内存缓存更小图片 Glide 以 url、view\_width、view\_height、屏幕的分辨率等做为联合 key,将处理后的图片缓存在内存缓存中,而不是原始图片以节省大小 ③ 与 Activity/Fragment 生命周期一致,支持 trimMemory ④ 图片默认使用默认 RGB\_565 而不是 ARGB\_888 虽然清晰度差些,但图片更小,也可配置到 ARGB\_888。 其他:Glide 可以通过 signature 或不使用本地缓存支持 url 过期 ### 七、汇总 ### id="iframe\_0.26131345238536596" scrolling="no"> 三者总体上来说,ImageLoader 的功能以及代理容易理解长度都一般。 Picasso 代码虽然只在一个包下,没有严格的包区分,但代码简单、逻辑清晰,一两个小时就能叫深入的了解完。 Glide 功能强大,但代码量大、流转复杂。在较深掌握的情况下才推荐使用,免得出了问题难以下手解决。 分类: [android图片缓存框架][android] 标签: [android图片缓存][android 1], [imageloader][], [glide][], [fresco][], [picasso][] 好文要顶 关注我 收藏该文 ![Image 1][] ![Image 1][] [![Image 1][]][Image 1 1] [linghu\_java][Image 1 1] [关注 - 1][- 1] [粉丝 - 3][- 3] \+加关注 0 0 [« ][Link 1] 上一篇: [Android系统更改状态栏字体颜色][Link 1] [» ][Link 2] 下一篇: [Android运行时注解][Link 2] </div> <div class="postDesc">posted @ <span id="post-date">2016-08-05 14:52</span> <a href="http://www.cnblogs.com/linghu-java/">linghu_java</a> 阅读(<span id="post_view_count">8374</span>) 评论(<span id="post_comment_count">3</span>) <a href="https://i.cnblogs.com/EditPosts.aspx?postid=5741358" rel="nofollow">编辑</a> <a href="#" onclick="AddToWz(5741358);return false;">收藏</a></div> </div> <script type="text/javascript">var allowComments=true,cb_blogId=290397,cb_entryId=5741358,cb_blogApp=currentBlogApp,cb_blogUserGuid='c99d8325-da24-e611-9fc1-ac853d9f53cc',cb_entryCreatedDate='2016/8/5 14:52:00';loadViewCount(cb_entryId);</script> 评论列表 \#1楼 2016-09-19 14:04 [羽战][Link 3] [ ][Link 4] linghu园友,想请教一下~,文章中多次提到一个表格。表格中的star,tssues,con,PR分别表示什么意思呢?还请博主赐教,嘿嘿 支持(0) 反对(0) \#2楼 2017-05-04 14:13 [lc-soft][] [ ][Link 5] @ 羽战 这些都是 github 上的数据,分别表示星星数、待处理问题数、贡献者数、代码合并请求数,主要体现了它们的社区影响力和活跃度。 支持(0) 反对(0) \#3楼 3684061 2017/5/5 11:02:58 2017-05-05 11:02 [羽战][Link 3] [ ][Link 4] @ lc-soft 谢谢啦 支持(0) 反对(0) 刷新评论 刷新页面 返回顶部 注册用户登录后才能发表评论,请 登录 或 注册, [访问][Link 6]网站首页。 [【推荐】50万行VC++源码: 大型组态工控、电力仿真CAD与GIS源码库][50_VC_ _CAD_GIS] [【推荐】腾讯云上实验室 1小时搭建人工智能应用][1] [【推荐】可嵌入您系统的“在线Excel”!SpreadJS 纯前端表格控件][Excel_SpreadJS] [【推荐】阿里云“全民云计算”优惠升级][Link 7] [![美团云0907][0907]][0907_0907] **最新IT新闻**: · [AI工具让用户仅用一张照片就能完成3D面部建模][AI_3D] · [Linux Mint 18.3名字敲定“Sylvia”:将包含系统备份工具][Linux Mint 18.3_Sylvia] · [欧洲地区Outlook.com和Exchange服务出现宕机情况][Outlook.com_Exchange] · [第八届Google Code-In活动启动:完成任务还有丰厚奖励][Google Code-In] · [成都共享单车堵塞街道:用户骑走1辆企业补投1辆][1_1] » [更多新闻…][Link 8] [![极光0908][0908]][0908_0908] **最新知识库文章**: · [Google 及其云智慧][Google] · [做到这一点,你也可以成为优秀的程序员][Link 9] · [写给立志做码农的大学生][Link 10] · [架构腐化之谜][Link 11] · [学会思考,而不只是编程][Link 12] » [更多知识库文章…][Link 13] fixPostBody(); setTimeout(function () \{ incrementViewCount(cb\_entryId); \}, 50); deliverAdT2(); deliverAdC1(); deliverAdC2(); loadNewsAndKb(); loadBlogSignature(); LoadPostInfoBlock(cb\_blogId, cb\_entryId, cb\_blogApp, cb\_blogUserGuid); GetPrevNextPost(cb\_entryId, cb\_blogId, cb\_entryCreatedDate); loadOptUnderPost(); GetHistoryToday(cb\_blogId, cb\_blogApp, cb\_entryCreatedDate); </div><!--end: forFlow --> </div> [Android_Imageloader_Picasso_Glide_Fresco]: http://www.cnblogs.com/linghu-java/p/5741358.html [android]: http://www.cnblogs.com/linghu-java/category/856173.html [android 1]: http://www.cnblogs.com/linghu-java/tag/android%E5%9B%BE%E7%89%87%E7%BC%93%E5%AD%98/ [imageloader]: http://www.cnblogs.com/linghu-java/tag/imageloader/ [glide]: http://www.cnblogs.com/linghu-java/tag/glide/ [fresco]: http://www.cnblogs.com/linghu-java/tag/fresco/ [picasso]: http://www.cnblogs.com/linghu-java/tag/picasso/ [Image 1]: [Image 1 1]: http://home.cnblogs.com/u/linghu-java/ [- 1]: http://home.cnblogs.com/u/linghu-java/followees [- 3]: http://home.cnblogs.com/u/linghu-java/followers [Link 1]: http://www.cnblogs.com/linghu-java/p/5737321.html [Link 2]: http://www.cnblogs.com/linghu-java/p/5773531.html [Link 3]: http://home.cnblogs.com/u/985911/ [Link 4]: http://msg.cnblogs.com/send/%E7%BE%BD%E6%88%98 [lc-soft]: http://home.cnblogs.com/u/1159360/ [Link 5]: http://msg.cnblogs.com/send/lc-soft [Link 6]: http://www.cnblogs.com [50_VC_ _CAD_GIS]: http://www.ucancode.com/index.htm [1]: https://cloud.tencent.com/developer/labs?fromSource=gwzcw.436876.436876.436876 [Excel_SpreadJS]: http://www.gcpowertools.com.cn/products/spreadjs/?utm_source=cnblogs&utm_medium=blogpage&utm_term=bottom&utm_content=SpreadJS&utm_campaign=community [Link 7]: http://click.aliyun.com/m/18488/ [0907]: https://images2017.cnblogs.com/news/24442/201709/24442-20170906183359226-1435856414.jpg [0907_0907]: /images/20220608/35e7f8d90bf54d5381c1859a5942bb23.png [AI_3D]: http://news.cnblogs.com/n/578549/ [Linux Mint 18.3_Sylvia]: http://news.cnblogs.com/n/578548/ [Outlook.com_Exchange]: http://news.cnblogs.com/n/578547/ [Google Code-In]: http://news.cnblogs.com/n/578546/ [1_1]: http://news.cnblogs.com/n/578545/ [Link 8]: http://news.cnblogs.com/ [0908]: https://images2017.cnblogs.com/news/24442/201709/24442-20170908132742304-1045119416.gif [0908_0908]: https://www.jiguang.cn/devservice?source=bky&hmsr=%E5%8D%9A%E5%AE%A2%E5%9B%AD&hmpl=&hmcu=&hmkw=&hmci= [Google]: http://kb.cnblogs.com/page/578103/ [Link 9]: http://kb.cnblogs.com/page/575829/ [Link 10]: http://kb.cnblogs.com/page/566880/ [Link 11]: http://kb.cnblogs.com/page/569057/ [Link 12]: http://kb.cnblogs.com/page/572854/ [Link 13]: http://kb.cnblogs.com/
相关 JAVA加载图片 package tuxing1; import java.awt.\; import java.awt.event.\; import java.io.\; i 清疚/ 2022年08月22日 11:24/ 0 赞/ 163 阅读
相关 图片加载 [Android四大图片缓存(Imageloader,Picasso,Glide,Fresco)原理、特性对比][Android_Imageloader_Picasso_Gl 川长思鸟来/ 2022年06月08日 07:30/ 0 赞/ 293 阅读
相关 Java加载图片 想必很多新手也曾像我一样想编出一些好玩的东西来,但如果连图片加载都不会,那可打脸了.闲话少说, 上代码 package Test; 冷不防/ 2022年06月04日 08:26/ 0 赞/ 198 阅读
相关 图片懒加载 懒加载的意义[(在线demo预览)][demo] 尽管很多公司的网页都有一些限制,比如页面的最大的图片大小不得大于50k,也有很多图片优化工具fis3、gulp等等,但是 痛定思痛。/ 2022年06月04日 07:58/ 0 赞/ 441 阅读
相关 图片懒加载 本文主要通过以下几方面来说明懒加载技术的原理,个人前端小菜,有错误请多多指出 一、什么是图片滚动加载? 通俗的讲就是:当访问一个页面的时候,先把img元素或是其他元素的 你的名字/ 2022年05月28日 05:29/ 0 赞/ 432 阅读
相关 图片懒加载 在实际的项目开发中,我们通常会遇见这样的场景:一个页面有很多图片,而首屏出现的图片大概就一两张,那么我们还要一次性把所有图片都加载出来吗?显然这是愚蠢的,不仅影响页面渲染速度, 偏执的太偏执、/ 2022年05月28日 02:07/ 0 赞/ 476 阅读
相关 图片懒加载 <!--<!doctype html>--> <!--<html lang="en">--> <!--<head>--> <!--<me 亦凉/ 2022年05月23日 12:19/ 0 赞/ 409 阅读
相关 图片懒加载 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> r囧r小猫/ 2022年05月21日 06:54/ 0 赞/ 444 阅读
相关 图片懒加载 \[外链图片转存失败(img-vbwUXXxJ-1563574134995)([https://upload-images.jianshu.io/upload\_images/ 川长思鸟来/ 2021年09月30日 00:24/ 0 赞/ 750 阅读
还没有评论,来说两句吧...