Volley底层实现解释笔记
来源:互联网 发布:网络流行的词 编辑:程序博客网 时间:2024/06/05 09:39
Volley源码
volley特别适合数据量小,通信频繁的网络操作。
Volley的总体设计是通过两种Dispatch Thread不断从RequestQueue中取出请求,根据是否已缓存调用Cache或Network这两类数据获取接口之一,从内存缓存或是服务器取得请求的数据,然后交由ResponseDelivery去做结果分发及回调处理。
首先在volley类中通过newrequestqueue构建一个可用于添加网络请求的RequestQueue对象,newrequestqueue有两个重载的静态方法,在两个参数的静态方法中,第二个参数httpstack默认为null,如果api小于9,则采用基于基于HttpClient 的 HttpClientStack,如果大于等于9,采用基于HttpURLConnection 的HurlStack。
接着再用这个创建好的stack构造一个代表网络的具体实现,再构造一个基于缓冲的具体实现,然后将网络(Network)对象和缓存(Cache)对象传入构建一个RequestQueue,启动这个RequestQueue。
然后在requestQueue类中,维护了两个基于优先级的Request 队列,缓存请求队列和网络请求队列,维护了一个正在进行中,尚未完成的请求集合,维护了一个等待请求的集合,如果一个请求正在被处理并且可以被缓存,后续的相同url 的请求,将进入此等待队列。调用start 方法,启动队列。Start方法中,开启一个缓存调度线程CacheDispatcher和n 个网络调度线程NetworkDispatcher。
具体流程是,
请求到来--------加入当前请求队列--为请求添加唯一序列号------------请求是否允许缓存---------不允许则将请求添加到网络请求队列中,允许则判断当前是否有相同请求正在被处理----------是则加入到相同请求的等待队列中,否则加入到缓存请求队列。
初始化缓存----------循环开始------缓存调度线程从缓存队列取一个request-------从缓存mCache获取结果--------结果不存在或者过期则将请求加入到网络请求队列,否则将缓存结果解析为response传输给主线程-------缓存结果不新鲜在把response传输给主线程后将请求加入到网络队列中做新鲜度验证。
循环开始----------网络调度线程从网络请求队列取一个request-----------执行request请求,获取networkresponse(304响应,并且请求已经有响应传输,请求结束【用来做新鲜度验证】)---------将networkresponse响应解析为response----------请求可以被缓存且请求结果缓存实体不为空则将请求缓存结果加入到缓存中,否则传输响应结果到主线程
HttpURLConnection和 AndroidHttpClient(HttpClient的封装)如何选择及原因:
在 Froyo(2.2) 之前,HttpURLConnection有个重大 Bug,调用close() 函数会影响连接池,导致连接复用失效,所以在Froyo 之前使用HttpURLConnection 需要关闭keepAlive。
另外在 Gingerbread(2.3) HttpURLConnection默认开启了 gzip压缩,提高了 HTTPS的性能,Ice Cream Sandwich(4.0) HttpURLConnection支持了请求结果缓存。
再加上 HttpURLConnection本身 API相对简单,所以对 Android来说,在 2.3之后建议使用 HttpURLConnection,之前建议使用AndroidHttpClient。
- Volley底层实现解释笔记
- Volley框架实现Android网络请求笔记
- Volley笔记
- Volley 笔记
- Volley 笔记
- Volley 笔记
- android学习笔记之通过Volley框架实现数据请求
- Struts 2 拦截器底层实现原理 学习笔记
- BBS项目笔记之八:hibernate底层查询的实现
- gdb反汇编详解C函数底层实现笔记
- 安卓学习笔记 6-8 hashmap底层实现
- 笔记70---volley
- Volley的使用笔记
- Volley学习笔记
- Volley 源码笔记(1)
- Volley 源码笔记(2)
- volley学习笔记
- Android Volley 笔记
- shell中sort -u 和 uniq 去重的区别
- Android 系统 root 破解原理分析
- 系统表查询
- stty命令
- android开发中Design Support Library完全使用实例
- Volley底层实现解释笔记
- 八皇后问题
- Apache下配置虚拟域名
- SwipeRefreshLayout,设置setRefreshing(true)没效果的解决方案
- maven仓库上传jar包
- SpringMVC接受复杂json数据类型
- Centos上源码安装Hadoop2.7.2
- future给任务设置时限
- js调用php和php调用js的方法举例