volley源码浅析

volley可以同时发送多个网络请求
volley请求之前会在CacheDispatcher缓存队列中查看是否存在,存在则直接加载出来显示成功或者失败
没有的时候,才在网络上去请求操作(NetWorkDispatcher),当网络请求结束后,往主线程发送数据通知主线程更新页面

StringRequest请求出来后,就将请求add到了请求队列里面去了,放到队列里面去了之后,在队列里面setRequestQueue(this),将请求标记了,如果这个请求request不应该缓存,就放到网络请求mNetWorkQueue队列里面,否则就放到缓冲队列mCacheQueue中。
mNetWorkQueue是一个集合,把请求全部放到集合中。相当于一个可阻塞的

newRequestQueue中有一个cacheDir缓存文件,这里不适用,一般自己去实现缓存。
在newRequestQueue中,stack没有传,当stack==null时,判断系统的版本是否大于9,如果大于等于9,使用HttpURLConnection进行网络请求,如果小于9,使用HttpClient进行网络请求。因为在9之前,HttpClient有一些bug,缓存的bug以及一些流没有关闭,扩展性不好。

RequestQueue在new出来时,将本地缓存地址和网络请求传入,queue.start(),这个start方法非常关键
在start方法中,new了一个CacheDispatcher,传入缓存队列,网络请求队列,并调用了CacheDispatcher 的start方法,start进入了子线程中。CacheDispatcher继承了Thread,CacheDispatcher的run方法中有一个死循环,在死循环中不停的在缓存队列中调用take取数据,如果没有缓存就将请求放到网络请求队列,如果有缓存,就将request中的数据拿到,返回回去。请求队列相当于一个可阻塞的线程池,池中有4个NetQWorkDispatcher对请求进行分发处理.

默认情况下,NetQWorkDispatcher只有4个,NetQWorkDispatcher也是继承Thread。

在volley中,一共有2个请求队列,一个请求队列,一个缓存队列,5个请求分发,1个CacheDispatcher,4个NetQWorkDispatcher,开了4个子线程在网络请求队列中取数据,所以可以处理高并发网络请求。

NetQWorkDispatcher中,将请求放到performRequest(request)中,performRequest(request)在一个接口中
performRequest(request)中有一个死循环,循环中也有一个HttpStack接口中的performRequest()方法,在这个方法中进行了网络请求。HttpStack有两个实现类,分别执行了两种请求方式,HurlStack中用HttpURLConnection,HttpClientStack 中用HttpClient请求 ,HttpStack才是真正去做网络请求的。

解析完之后,将如果结果需要缓存就将结果缓存,并将结果返回给主线程,那么如何返回到主线程呢?NetQWorkDispatcher中有一个ResponseDelivery接口类型的变量,在它的实现类中构造方法里有一个线程池,线程池实现了Runable,Runable在执行的时候,用handler调用post(r)方法发送了一个消息,将Runable中的Run方法运行在了主线程。

关于volley取消请求
每个StringRequest对象添加到请求队列中之前,都会设置一个tag,在需要是,调用RequestQueue中cancelAll(tag)方法,将设置了相同tag的所有请求都取消掉。


关于请求队列RequestQueue
如果要自己创建一个请求队列,需要自己存入缓存的地址和请求方式,一般都不用自己去创建,直接用框架的即可。

请求队列RequestQueue是一个单例设计模式,不需要开启多个。

关于voley的imageRequest
请求需要传入url地址,一个请求成功接口实现对象,图片最大宽高,图片缩放类型,图片存储方式(config.ARGB_8888),请求失败的接口实现对象。

volley还可以使用自带的自定义控件请求图片


关于ImageLoader
new此对象时,传入请求队列和ImageCache,ImageCache接口需要去实现,并重写其中的两个方法,系统demo实现ImageCache 缓存策略为继承LruCache,缓存大小为3个屏幕的ARGB大小.
拿ImageLoader做网络请求,请求成功接口回调中请求结果response.getBitmap可的到bitmap图片。

因为volley在图片请求上,对图片处理细节不是很好,不建议使用volley请求图片


关于自定义request对象,主要需要重写parseNetworkResponse方法,把数据请求到之后,对结果进行处理返回,可以将JSON格式或者XML格式数据使用Gson或者XStream工具来进行修改。

还有JsonArrayRequset和JsonObjectRequest,这里用这中方式请求数据,不如用StringRequest请求后封装成javabean




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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值