常用图片加载框架比较(Glide、volley、Picasso)

             Volley
                      一、ImageRequest:
                                    来对网络图片进行请求,放入请求队列,获取后现在在控件上面
                    
                             步骤:
                                    创建请求队列mQueue;
                               创建ImageRequest 请求,并进行配置,并将请求放入请求队列mqueue中去;
                               ImageRequest只有一个构造方法:对图片大小和图片格式进行设置;

                             原理:
                                    拿到要请求的URL,去缓存中遍历,是否已存在要请求的资源;mCache.getBitmap()
                                        是
                                            从缓存中取出请求
                                            得到缓存中取出需要的请求结果
                                                是
                                                    解析结果
                                                    返回结果到主线程(mDelivery.postResponse())
                                                否
                                                    结果为null或者缓存过期
                                                    添加到网络请求队列
                                        否
                                            进行网络请求(MakeImageRequest)
                                                从网络请求队列中取出具体的请求
                                                进行请求
                                                解析网络请求
                                                是否缓存
                                                    是:
                                                        添加到缓存
                                                    否:
                                                        返回结果到主线程(mDelivery.postResponse())

                        二、ImageLoader
                                      ImageLoader也可以用于加载网络上的图片,并且它的内部也是使用ImageRequest来实现的,
                                      ImageLoader明显要比ImageRequest更加高效,因为它不仅可以帮我们对图片进行缓存,还可以过滤掉重复的链接,避免重复发送请求。

                                 步骤:
                                        1,创建请求队列;
                                   2,创建imageloader对象,其中imageloader的构造方法第二个参数为imageCache的实现类,实现图片缓存的算法类。
                                   3,创建imagelistener对象,主要设置图片加载失败和加载过程中的图片设置。
                
                        三、NetworkImageView
                                      是一个自定义控件,它是继承自ImageView的,具备ImageView控件的所有功能,并且在原生的基础之上加入了加载网络图片的功能。

                                步骤:
                                        1. 创建一个RequestQueue对象。
                                        2. 创建一个ImageLoader对象。
                                        3. 在布局文件中添加一个NetworkImageView控件。
                                        4. 在代码中获取该控件的实例。
                                        5. 设置要加载的图片地址。

                                    由于NetworkImageView是一个控件,在加载图片的时候它会自动获取自身的宽高,然后对比网络图片的宽度,再决定是否需要对图片进行压缩。
                                    它的压缩过程是在内部完全自动化的,它会始终呈现给我们一张大小刚刚好的网络图片,不会多占用任何一点内存。

                                    如果你不想对图片进行压缩,只需要在布局文件中把NetworkImageView的layout_width和layout_height都设置成wrap_content就可以了,这
                                    样NetworkImageView就会将该图片的原始大小展示出来,不会进行任何压缩。

            Picasso
                    定义:
                            Picasso是Square公司开源的一个Android图形缓存库,可以实现图片下载和缓存功能.
                            采用链式调用的方式。

                    原理:
                            接收到加载和显示图片的任务
                            创建Request,并交给dispatcher进行处理(BitmapHunter)
                            Dispatcher分发任务到具体的RequestHandler
                                    ResourceRequesthandler
                                    FileRequestHandler
                                    NetWorkRequestHandler
                            任务通过MemoryCache及Handler(数据获取接口) 来获取图片
                            图片获取成功后通过PicassoDrawable显示到Target(ImageView)中。

                    优点:
                            不仅实现了图片异步加载的功能,还解决了android中加载图片时需要解决的一些常见问题:
                                   1.解决了在adapter中需要取消已经不在视野范围的ImageView图片资源的加载,否则会导致图片错位的这个问题;
                                   2.使用最少的内存完成复杂的图片转换,比如把下载的图片转换为圆角等;
                                   3.自带内存和硬盘二级缓存功能;
                                   4.从不同资源进行加载(网络、本地、assests、资源)
                                   5.支持优先级处理

                    缺点:
                            功能较简单---图片加载
                            性能(加载速度)比别的库慢(Glide、Fresco)
                            自身实现本地无缓存
            
            Glide
                    介绍:
                             Glide 是一个高效、开源、Android设备上的媒体管理框架,它遵循BSD、MIT以及Apache 2.0协议发布。默认使用httpurlconnection作为网络请求模块;
                             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需要知道activity的生命周期,在Glide.with( ) 方法中,向当前的Activity当中添加一个隐藏的Fragment。通过fragment来监听activity生命周期的变化。 因为Fragment的生命周期和Activity是同步的,如果Activity被销毁了,Fragment是可以监听到的,这样Glide就可以捕获这个事件并停止图片加载了。
                                      
                            转码的支持:
                                Glide的toBytes() 和transcode() 两个方法可以用来获取、解码和变换背景图片,并且transcode() 方法还能够改变图片的样式
                    
                            动画的支持:
                                新增支持图片的淡入淡出动画效果(调用crossFade()方法)和查看动画的属性的功能。
                    
                            OkHttp和Volley的支持:
                                默认选择HttpUrlConnection作为网络协议栈,还可以选择OkHttp和Volley作为网络协议栈
                    
                            其他功能:
                                如在图片加载过程中,使用Drawables对象作为占位符、图片请求的优化、图片的宽度和高度可重新设定、缩略图和原图的缓存等功能

                   设计流程:
                         Glide收到加载及显示资源的任务

                         创建Request并将它交给RequestManager(任务管理器)
                             singleRequest
                             ThumbnailRequestCoordinatior

                         Request启动Engine(数据获取引擎)去数据源获取资源
                             通过Fetcher获取数据
                                     LocalURIFetcher
                                     OkhttpStreamFetcher
                             通过缓存获取数据
                                     MemoryCache
                         获取到后Transformation(图片处理)处理后,回调交给Target(目标)进行图片显示

                             
                        
                    缓存策略:( 内存–>磁盘–>网络
                         内存缓存
                                Glide默认是会在内存中缓存处理图(RESULT)的。(isCacheable = true)
                                         内存缓存最大空间(maxSize)=每个进程可用的最大内存 * 0.4

                         磁盘缓存                                    
                                Glide磁盘缓存策略分为四种,默认的是RESULT。 磁盘缓存大小: 250 * 1024 * 1024(250MB)
                            1.ALL:缓存原图(SOURCE)和处理图(RESULT)
                            2.NONE:什么都不缓存
                            3.SOURCE:只缓存原图(SOURCE)
                                   4.RESULT:只缓存处理图(RESULT) —默认值
                                清除缓存:                     
                                        清除所有内存缓存(需要在Ui线程操作)
                    Glide.get(this).clearMemory();
                                        清除所有磁盘缓存(需要在子线程操作)
                          Glide.get(MainActivity.this).clearDiskCache();
        总结比较:
            Glide和Picasso都是非常完美的库。
            
            Picasso:
                    和Square的网络库一起能发挥最大作用,因为Picasso可以选择将网络请求的缓存部分交给了okhttp实现。
            
            Glide:
                    模仿了Picasso的API,而且在他的基础上加了很多的扩展(比如gif等支持),Glide默认的Bitmap格式是RGB_565,
                            比Picasso默认的ARGB_8888格式的内存开销要小一半;
                    Picasso缓存的是全尺寸的(只缓存一种),而Glide缓存的是跟ImageView尺寸相同的(即56*56和128*128是两个缓存) 。

            比较:
                     Glide加载图像以及磁盘缓存的方式都要优于Picasso,速度更快,并且Glide更有利于减少OutOfMemoryError的发生,GIF动画是Glide的杀手锏。
                     不过Picasso的图片质量更高。我的建议是使用Glide,但是将Bitmap格式换成ARGB_8888、让Glide缓存同时缓存全尺寸和改变尺寸两种。

                     Picasso所能实现的功能,Glide都能做,无非是所需的设置不同。
                     但是Picasso体积比起Glide小太多如果项目中网络请求本身用的就是okhttp或者retrofit(本质还是okhttp),那么建议用Picasso,
                     体积会小很多(Square全家桶的干活)。
                     Glide的好处是大型的图片流,比如gif、Video,如果你们是做美拍、爱拍这种视频类应用,建议使用。

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值