在Android中,进行内存优化,最重要的优化处理是对图片进行内存的优化处理,毕竟图片占用的内存是非常大的,对于图片的内存处理,是android中内存优化的重中之重。目前开源的4大图片处理框架都对图片的内存方面处理都是非常优秀的,但是对于这么多的框架,如何选择适合自己项目需求的框架,就需要先了解每个框架的特性,下面就来分析一下每个框架的特点。

Universal-Image-Loader(UIL)

-不支持GIF图片加载, 缓存机制没有和http的缓存很好的结合

ImageLoader的设计流程:

ImageLoader收到展示和加载图片的任务,并交给ImageLoaderEngine(创建任务,并进行任务调度)分配到具体的线程池去完成,任务通过 Cache (本地缓存)及 ImageDownloader (从网络获取图片)获取图片,中间可能经过 BitmapProcessor(图片处理器) 和 ImageDecoder (图片解码)处理,最终转换为Bitmap 交BitmapDisplayer 在 ImageAware 中显示。
注:其中 Cache 分为 MemoryCache(内存缓存) 和 DiskCache(硬盘缓存) 两部分。
Processor 资源(图片)处理器,负责处理资源,比如旋转、压缩、截取等。

Glide

Glide是一个高效、开源、 Android设备上的媒体管理框架,Glide具有获取、解码和展示视频剧照、图片、动画等功能,它还有灵活的API,这些API使开发者能够将Glide应用在几乎任何网络协议栈里。创建Glide的主要目的有两个,一个是实现平滑的图片列表滚动效果(滚动流畅),另一个是支持远程图片的获取、大小调整和展示

  • GIF动画的解码:通过调用Glide.with(context).load(“图片路径“)方法,GIF动画图片可以自动显示为动画效果。如果想有更多的控制,还可以使用Glide.with(context).load(“图片路径“).asBitmap()方法加载静态图片,使用Glide.with(context).load(“图片路径“).asGif()方法加载动画图片

  • 本地视频剧照的解码:通过调用Glide.with(context).load(“图片路径“)方法,Glide能够支持Android设备中的所有视频剧照的加载和展示

  • 缩略图的支持:为了减少在同一个view组件里同时加载多张图片的时间,可以调用Glide.with(context).load(“图片路径“).thumbnail(“缩略比例“).into(“view组件“)方法加载一个缩略图,还可以控制thumbnail()中的参数的大小,以控制显示不同比例大小的缩略图

  • Activity生命周期的集成:当Activity暂停和重启时,Glide能够做到智能的暂停和重新开始请求,并且当Android设备的连接状态变化时,所有失败的请求能够自动重新请求

  • 转码的支持:Glide的toBytes() 和transcode() 两个方法可以用来获取、解码和变换背景图片,并且transcode()
    方法还能够改变图片的样式

  • 动画的支持:新增支持图片的淡入淡出动画效果(调用crossFade()方法)和查看动画的属性的功能

  • 支持优先级处理

  • OkHttp和Volley的支持:默认选择HttpUrlConnection作为网络协议栈,还可以选择OkHttp和Volley作为网络协议栈

  • 其他功能:如在图片加载过程中,使用Drawables对象作为占位符、图片请求的优化、图片的宽度和高度可重新设定、缩略图和原图的缓存等功能

Glide的流程设计:

Glide 收到加载及显示资源的任务,创建 Request 并将它交给RequestManager(任务管理器),Request 启动 Engine(数据获取引擎) 去数据源获取资源(通过 Fetcher(数据获取器) ),获取到后 Transformation(图片处理) 处理后交给 Target(目标)。

Picasso

  • 自带统计监控功能,支持图片缓存使用的监控,包括缓存命中率、已使用内存大小、节省的流量等。

  • 支持优先级处理

  • 支持延迟到图片尺寸计算完成加载

  • 支持飞行模式、并发线程数根据网络类型而变,手机切换到飞行模式或网络类型变换时会自动调整线程池最大并发数。

  • “无”本地缓存。Picasso 自己没有实现本地缓存,而由okhttp 去实现,这样的好处是可以通过请求 Response Header 中的 Cache-Control 及 Expired 控制图片的过期时间。

  • 在adapter中需要取消已经不在视野范围的ImageView图片资源的加载,否则会导致图片错位,Picasso已经解决了这个问题。

  • 使用复杂的图片压缩转换来尽可能的减少内存消耗

  • 不支持GIF,默认使用ARGB_8888格式缓存图片,缓存体积大

Picasso的流程设计:

Picasso 收到加载及显示图片的任务,创建 Request 并将它交给 Dispatcher,Dispatcher 分发任务到具体 RequestHandler,任务通过 MemoryCache 及 Handler(数据获取接口) 获取图片,图片获取成功后通过 PicassoDrawable 显示到 Target 中。

注:Dispatcher 负责分发和处理 Action,包括提交、暂停、继续、取消、网络状态变化、重试等等。

Fresco

  • 支持webp格式的图片,是Google官方推行的,它的大小比其它格式图片的大小要小一半左右,使用该格式最大的优点就是轻量、省流量、图片加载迅速。而Fresco是通过jni来实现支持WebP格式图片。

  • 5.0以下系统:使用”ashmem”(匿名共享内存)区域存储Bitmap缓存,这样Bitmap对象的创建、释放将永远不会触发GC,关于”ashmem”存储区域,它是一个不在Java堆区的一片存储内存空间,它的管理由Linux内核驱动管理,不必深究,只要知道这块存储区域是别于堆内存之外的一块空间就行了,且这块空间是可以多进程共享的,GC的活动不会影响到它。5.0以上系统,由于内存管理的优化,所以对于5.0以上的系统Fresco将Bitmap缓存直接放到了堆内存中。除了使用Ashmem的黑科技外,还采用了类似GC的引用计数机制,通过对图片对象的引起计数,使得不再使用的图片对象可以更早的被回收以便降低内存开销。

  • 渐进式加载JPEG图片, 支持图片从模糊到清晰加载

  • 图片可以以任意的中心点显示在ImageView, 而不仅仅是图片的中心

  • JPEG图片改变大小也是在native进行的, 不是在虚拟机的堆内存, 同样减少OOM

  • 很好的支持GIF图片的显示

  • 框架较大, 影响Apk体积,使用较繁琐

下面是4个框架的对比:

ImageLoader Glide Picasso Fresco
框架是否一直支持更新
是否易用(主要是指代码调用是否简洁)
包的大小 162kb 474kb 120kb 16.8M(zip)
是否能够灵活配置可以灵活配置(例如线程池,图片下载器,内存缓存策略,硬盘缓存策略,图片显示选项以及其他的一些配置)
内存占用(相对于其他三个框架) 内存占用偏高(仅仅比Fresco占用内存小一点) 适中
是否支持下载进度监听
是否支持生命周期 生命周期支持不够智能,需要自己手动的在生命周期方法中进行处理
动图,webp是否支持 不支持gif,不支持缩略图,支持webP

总结
Universal Image Loader是早期比较有代表性的图片加载库,虽然目前已经停止维护,不再推荐使用,但是其架构设计和实现依然值得借鉴。Picasso的设计充分体现了Square公司在架构设计上一贯的简洁易用风格(链式调用)。Glide充分吸收了Picasso的优点,并在此基础上做了大量的优化和改进。Fresco 可以说是综合了之前图片加载库的优点并将性能优化到极致,但它的包很大,用法比较复杂,API不够简洁,所以, Fresco 在图片较多的应用中更能凸显其价值,如果应用没有太多图片需求,还是不推荐使用 Fresco,Glide基本就能满足需求。

参考:
主流图片加载框架ImageLoader、Glide、Picasso、Fresco性能分析—内存占用比较

Picasso, ImageLoader, Fresco, Glide 优劣

Android 三大图片加载框架的对比——ImageLoader,Picasso,Glide

andrid四大图片加载框架对比分析
https://www.jianshu.com/p/f00c4ee582f5

Android各大图片加载框架之间的比较
https://blog.csdn.net/tomcat0916/article/details/81902189

Android图片框架对比
https://www.jianshu.com/p/3a57d535c656

Android 常用图片框架对比相关推荐

  1. android图片框架对比(全)ImageLoader、Picasso、Glide、Fresco、Coil

    一.直接表格对比 红色代表严重缺点 对比项 ImageLoader Picasso Glide Fresco Coil 库是否维护 false true true true true 是否支持gif ...

  2. Android常用图片加载库介绍及对比

    前言 图片加载在 Android开发项目中是必不可少的,为了降低开发周期和难度,我们经常会选用一些图片加载的开源库,而Android发展到现在图片加载开源库也越来越多了,下面介绍几种开发中主流的图片加 ...

  3. 2018年android常用的框架介绍

    转载地址:http://blog.csdn.net/RuingMan/article/details/73546718 http://www.cnblogs.com/jincheng-yangchao ...

  4. Android常用开源框架

    快速索引 框架名称 上榜关键字 1.Retrofit 网络 2.okhttp 网络 3.Butter Knife 代码模板 4.MPAndroidChart 图表 5.glide 图片 6.leakc ...

  5. Android常用三方框架

    1.下拉刷新 Android-Ptr-Comparison-Android 下拉刷新开源库对比,非常nice!! Android-PullToRefresh- 最经典.最多人用的下拉刷新.加载更多. ...

  6. 25类Android常用开源框架

    1.图片加载,缓存,处理 框架名称 功能描述 Android Universal Image Loader 一个强大的加载,缓存,展示图片的库,已过时 Picasso 一个强大的图片下载与缓存的库 F ...

  7. Android 常用开源框架源码解析 系列 (四)Glide

    一.定义  Glide 一个被google所推荐的图片加载库,作者是bumptech.对Android SDk 最低要求是 API 10  与之功能类似的是Square公司的picasso  二.基本 ...

  8. Android常用的框架

    1.volley  项目地址 https://github.com/smanikandan14/Volley-demo  (1)  JSON,图像等的异步下载:  (2)  网络请求的排序(sched ...

  9. android 常用编程框架

    作为一名程序猿,好的工具会让你在搬运工的道路上越走越远.以下框架是AC在开发过程中经常会使用到的一些好的框架.列在这里做一个小小的总结,包含但不限于此. 响应式编程 RxJava https://gi ...

最新文章

  1. h5打开麦克风权限录音_MAC录屏没有声音?如何在苹果电脑MACBOOK上录音录屏
  2. flex的mxmlc命令行编译as3文件成swf
  3. 人工智能不是计算机领域能学么,华南理工大学《高级人工智能》考试真题1
  4. java 杀掉 linux下进程和进程的子孙进程
  5. spring roo_使用Spring Roo进行概念验证
  6. 面试题:如何设计一个高并发的系统?
  7. 熊猫直播宣布正式关站 至今已运行1286天
  8. 编程实现 有符号乘法溢出判断
  9. nginx linux详细安装部署教程,Nginx Linux详细安装及部署实战
  10. 目标检测之Selective Search原理简述(转)
  11. SLAM--G2o实现BA优化
  12. Spring----pom.xml报错Missing artifact org.aspectj:aspectjweaver:jar:1.8.0.M1
  13. day01:打印常见测试点总结
  14. 2022图片在线加水印源码
  15. 世界电影经典《第七封印》
  16. 如何解决直播中的播放杂音、噪音、回声问题 | 直播疑难杂症排查
  17. 《iOS移动开发从入门到精通》图书连载2:如何成为一名iOS开发者
  18. cad断点快捷键_入门CAD必备,如何有效记住CAD快捷键
  19. 生日快乐网页模板(HTML5+CSS3+JS)
  20. CAD自学笔记21条,零基础学CAD可以看看

热门文章

  1. 全局负载均衡GSLB
  2. 2w字Python列表,全了!
  3. 夜神模拟器和电脑如何互进行文件传输
  4. C++PrimerPlus(第6版)中文版:Chapter16.4.6关联容器_setops.cpp
  5. 代码编辑器语法着色功能实现-Java版
  6. CSS中的圆角与倒角
  7. Erlang 下载安装
  8. i5 12400f和i5 12600kf参数对比
  9. modbus虚拟服务器,modbus客户端服务器区别
  10. 微信小程序云开发CMS中WebHook功能的使用方法