Android 图片加载框架:Google开发的框架源码Volley 以及Picasso和Glide比较

https://blog.csdn.net/mwq384807683/article/details/71305969

首先了解一下,它是封装了HttpUrlConnection和HttpClient类(高版本用httpconnection,低版本用httpclient)的一个框架,

适用于数据量少但是通信频繁的情况,如加载图片;

 

就拿StringRequest(用来请求字符串的)举例:

Volley的顺序是 :  Http请求-------再接受响应   只需三步

GET:

1.首先新建一个请求队列,用来存放一会要发出的Http消息:

 2.构造一条HTTP请求:

3.队列将请求发送出去:

 

 

POST:

和GET一样,也只需三步;不同的是在第二步写HTTP请求;

 

 

Volley原理:

一开始创建Requestqueue就是调用的下面这个方法:

看看newRequestQueue的代码:

看看start函数是要开始干什么?

启动网络调度的时候,启动四个线程来进行网络任务

 

 

Volley设置图片有三种方式:

ImageRequest;

ImageLoader;(重点分析源码)

NewworkImageView;

 

 

ImageRequest没有采用缓存,所以不展开说;

使用方法:

 


 

RequestQueue源码已经讲过:

接下来就是创建一个ImageLoader对象:传入两个参数,一个就是RequestQueue对象,另一个就是实现ImageCache接口的实现类的对象;

ImageCache接口中定义了两个方法:存入putBitmap和读取getBitmap的方法,然后自己去实现就行;

接着就是调用ImageLoader的静态方法getImageListener来获取ImageListener对象,这个ImageListener是个接口,有一个定义在网络正常情况下的逻辑方法,这个接口还继承了ErrorListener接口,这个接口有个网络错误情况下的逻辑;通过定义一个静态方法来声明一个匿名内部类{在其中重写成功和失败的逻辑}

 

 有了这个ImageListener对象之后,就调用ImageLoader对象的get方法发出请求,将url和ImageListener对象传入,

这个get方法其实调用的是ImageContainer类的get,并返回一个四个参数Imagecontainer的get方法:

 然后ImageContainer类的get方法解释如上,重要的是调用了ImageContainer的构造方法),

这个缓存key封装了图片URL请求,最大宽度和最大高度;然后通过之前的ImageCache类的getBitmap(缓存key)方法获取一级缓存,通过这个一级缓存得到bitmap对象,bitmap对象不为空的话,就调用ImageListener对象的onResponse方法并显示缓存中的图片;

请求图片的接口,可以看到,他通过图片路径+高度+宽度生成了一个缓存的Key.然后会通过这个Key去mCache中查找是否有缓存图片.如果有的话,会直接直接把图片包装成一个ImageContainer.且直接返回,如果没有找找到的话.会生成一个一个请求,将这条请求入队.

如果这个一级缓存为空,就通过构造一个ImageContainer对象,直接返回;也是同样调用ImageListener的onResponse方法,显示默认图片

通过BatchedImageRequest类来确保Container每个imageContainer对象不重复

 

那如果没有缓存key或者对应的一级缓存,那就只能去ImageRequest来请求,通过BatchedImageRequest来将容器中的ImageContainer对象全部给到request;

最后在RequestQueue中将请求添加进去;

 

 

 

那我们看下这个ImageContainer类如何构造的:

这个ImageContainer类就是对图片数据请求的数据进行封装:构造方法中四个数据参数:图片资源,请求地址,cachekey(就是get方法中的缓存key,包含了请求地址,最大高限制,宽限制三个参数)和imageListener,还有一个取消请求的方法,这个方法判断cachekey是否为空,不为空的话就说明有缓存,就返回true取消request,相反就返回false,继续request;

然后看看BatchedImageRequest类实现:

含有ImageContainer对象的集合MContainers每次添加ImageContainer对象,都先进行判断有没有已存在的ImageContainer对象,再添加进去;

这个类是对网络请求进行封装的类,和ImageContainer类不同的是,ImageContainer如果有三个图片地址url,会初始化三个ImageContainer对象,但是BatchedImagerequest类只会初始化一个,类中会进行判断,判断是否有重复的ImageContainer对象在Container里;

 

 

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值