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,如果你们是做美拍、爱拍这种视频类应用,建议使用。