volley关键的代码这里已经分析完了,下面梳理一下完整的Volley流程
Volley的使用从构造Request对象开始,Volley默认提供了四种request的实现,StringRequest,ImageRequest,JsonObjectRequest以及JsonArrayRequest。
这些request主要做的功能就是覆写deliverResponse方法,以及parseNetworkResponse,前者用来将结果交付到回调函数,后者用来定义如何去解析Volley封装后的NetWorkResponse。
然后在创建一个RequestQueue队列,将我们刚创建的request放入进入。
然后在回调方法中,就可以得到我们结果了。
Volley的关键就是RequestQueue,RequestQueue根据request的属性来决定将request给哪一个分发器,RequestQueue通过Volley.newRequestQueue来初始化1个CacheQueue以及4个NetWorkQueue。对于新加入的request,会判断该request是否需要缓存,默认是需要缓存的,如果不需要缓存则直接用NewWorkDispathcer对该request进行分发,需要缓存则会通过CacheQueue进行分发。
这两个分发器都是一个无限循环的Thread,不断处理队列中每一个Request。对于CacheDispatcher,会根据request中的cachekey来从Cache.Entity取出缓存的entity,然后验证缓存是否过期,如果过期就需要重新进行请求,如果没有过期,就直接用request去解析缓存的response,解析完以后,判断是否需要更新缓存,需要的话,就继续通过网络请求得到新的response。但不管需不需要,进行response交付的都是旧的缓存内容。判断需不需要更新缓存则是因为有些response会返回一个缓存过期可用时间,使得即使过期也可用。
这样,有缓存就从缓存取出,没有缓存的网络请求,网络请求是通过NetWorkDispatcher,对于Request,调用HttpStack进行请求,Android2.3以上就是HttpUrlConnection,以下就是HttpClient。而通过NetWork来封装一遍HttpStack,做的目的就是将response封装成NetWorkResponse,得到response以后,通过request去解析该response,并且根据需要来缓存他,全部处理完以后,将request,reponse进行结果交付,也就是最终调用我们构造request时,传入的回调方法。这样我们就能在UI线程中拿到response,完成Http请求。