作为android开发者,volley这个框架应该不陌生,它有很多优点。比如通信速度快,代码编写简单,能取消请求,能并发,能缓存等等。
volley为什么这么好用呢,今天我们来看看源码,分析分析原理。
从使用开始说起,分三步:
1.RequestQueue queue = Volley.newRequestQueue(this);
2. StringRequest sq =new StringRequest();
3. queue.add(sq);
首先看第一步,Volley.newRequestQueue,这儿主要干了三件事儿,第一是实例化网络请求类BasicNetwork,第二是实例化一个CacheDispatcher,第三是实例化4个NetworkDispatcher。CacheDispatcher继承自线程,有一个while(true)的死循环,会一直等待缓存队列中新的请求出现,一旦出现新请求,那么就会查看该请求是否存在于缓存,若不存在,则将该请求加入网络请求队列,若存在,那么判断缓存是否超时,若没超时,则直接取出缓存,并解析和通知主线程处理,若超时,则加入网络请求队列。NetWorkDispatcher也继承自线程,类似于CacheDispatcher,也有一个while(true)死循环,一直等待网络请求队列中心的请求出现,一旦出现,则执行网络请求操作,请求成功则解析和通知主线程处理,并加入缓存。若请求失败则通知主线程请求失败了。
再看第二步,StringRequest 继承自Request类,Request类重点关注两个方法,deliverResponse方法和parseNetworkResponse,deliverResponse它内部调用了mListener.onResponse(response)方法,而这个方法正是我们在写一个请求的时候,添加的listener所重写的onResponse方法,也就是说,响应成功后在这里调用了onResponse()方法。接着看pareNetworkResponse方法,可以看出这里主要是对response响应做出一些处理。可以对比一下不同请求类的这个方法,都会不同的,所以说,这个方法是针对不同的请求类型而对响应做出不同的处理。比如说,如果是StringRequest,则将响应包装成String类型;如果是JsonObjectRequest,则将响应包装成JsonObject。
第三步,queue.add,这儿会先判断请求是否是缓存的,若不是,则直接加入网络请求队列,就完了。若是缓存的,那么就加入缓存对了。
更多细节请到这儿观看
https://www.jianshu.com/p/15e6209d2e6f