volley源代码解析(七)--终于目的之Response<T>
在上篇文章中,我们终于通过网络,获取到了HttpResponse对象
HttpResponse是android包里面的一个类。然后为了更高的扩展性,我们在BasicNetwork类里面看到。Volley将其包装成一个Volley自己的对象NetworkResponse
另外,在BasicNetwork类中我们也注意到。对HttpResponse包装成NetworkResponse的过程中,使用HttpResponse的Inputstream,将数据保存在一个byte[]数组中。
BasicNetwork代码片段:
// Some responses such as 204s do not have content. We must check.
if (httpResponse.getEntity() != null) {//返回响应主体
responseContents = entityToBytes(httpResponse.getEntity());//将主体转换byte[]形式
} else {//没有返回内容
// Add 0 byte response as a way of honestly representing a
// no-content request.
responseContents = new byte[0];
}
这样可能造成的一个问题,就是内存溢出。这也是Volley之所以不能用来下载大文件的原因,由于byte[]是保存在内存中的。
好了,以下让我们来看NetworkResponse的源代码
/**
* The HTTP status code.
* http状态码
*/
public final int statusCode; /**
* Raw data from this response.
* 数据
*/
public final byte[] data; /**
* Response headers.
* 响应头
*/
public final Map<String, String> headers; /**
* True if the server returned a 304 (Not Modified).
* 网页是否改动.304
*/
public final boolean notModified; /**
* Network roundtrip time in milliseconds.
* 响应时间
*/
public final long networkTimeMs; /**
* Creates a new network response.
* @param statusCode the HTTP status code
* @param data Response body
* @param headers Headers returned with this response, or null for none
* @param notModified True if the server returned a 304 and the data was already in cache
* @param networkTimeMs Round-trip network time to receive network response
*/
public NetworkResponse(int statusCode, byte[] data, Map<String, String> headers,
boolean notModified, long networkTimeMs) {
this.statusCode = statusCode;
this.data = data;
this.headers = headers;
this.notModified = notModified;
this.networkTimeMs = networkTimeMs;
}
本质上没有什么特别的。仅仅是将HttpResponse的内容。简单地转移到NetworkResponse中
接下来,在响应分发过程中,request负责把NetworkResponse又包装成Response<T>对象
NetworkDispatcher代码片段:
// Parse the response here on the worker thread. 解析网络响应到本地
Response<? > response = request.parseNetworkResponse(networkResponse);
至于怎么解析。不同的request应该有自己的实现。
可能看到这里大家有些迷糊,原因是我们找回了之前类的一些代码
在前面的解析中,我们总是忽略这些片段,默觉得全都是Response。由于在前面的过程中。理解Response之间的不同会给我们理解核心代码带来困扰,所以我们都跳过了。
如今源代码解析接近尾声,我们再回头看各种各样的Response就豁然开朗了。
httpStack获得的是HttpResponse,由于HttpResponse是android的内置类,我们使用起来很不灵活(由于我们希望response都是一样的,不管是从缓存中取的还是网络请求的)
依据上述原因,我们有了NetworkResponse。这个代表网络请求对应。这是Volley的自己定义类,这样我们使用起来就灵活了(理论上缓存也应该有一个CacheResponse,然而Volley没有这样设计)。更加重要的一点是NetworkResponse中的byte[]数组保存了网络数据(前面说过。这是造成内存溢出的原因)
最后。为了统一全部的Response,我们将NetworkResponse(理论上另一个CacheResponse)又封装成了了Response<T>
OK,Volley解析基本到这里就结束了。
接下来的文章。将会带大家看一下Volley最后的一部分小花絮,关于图片载入的部分。
另外,我还会依据自己的理解,带大家来改造Volley,使之有很多其它更完好的功能。
volley源代码解析(七)--终于目的之Response<T>的更多相关文章
- volley源代码解析(六)--HurlStack与HttpClientStack之争
Volley中网络载入有两种方式,各自是HurlStack与HttpClientStack.我们来看Volley.java中的一段代码 if (stack == null) {//假设没有限定stac ...
- Android:Volley源代码解析
简单实例 Volley是一个封装HttpUrlConnection和HttpClient的网络通信框架,集AsyncHttpClient和Universal-Image-Loader的长处于了一身.既 ...
- Tomcat源代码解析系列
学web也有一段时间了.为了从底层了解web应用在Tomcat中的执行,决定看一下Tomcat的源代码參见<How Tomcat works> 和大牛博客.对大体架构有了一定的了解, ...
- Android Volley全然解析(四),带你从源代码的角度理解Volley
版权声明:本文出自郭霖的博客,转载必须注明出处. https://blog.csdn.net/sinyu890807/article/details/17656437 转载请注明出处:http://b ...
- Android源代码解析之(七)-->LruCache缓存类
转载请标明出处:一片枫叶的专栏 android开发过程中常常会用到缓存.如今主流的app中图片等资源的缓存策略通常是分两级.一个是内存级别的缓存,一个是磁盘级别的缓存. 作为android系统的维护者 ...
- Tomcat请求处理过程(Tomcat源代码解析五)
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/ ...
- struts2 文件上传和下载,以及部分源代码解析
struts2 文件上传 和部分源代码解析,以及一般上传原理 (1) 单文件上传 一.简单介绍 Struts2并未提供自己的请求解析器,也就是就Struts2不会自己去处理multipart/form ...
- SDWebImage源代码解析(二)
上一篇:SDWebImage源代码解析(一) 2.缓存 为了降低网络流量的消耗.我们都希望下载下来的图片缓存到本地.下次再去获取同一张图片时.能够直接从本地获取,而不再从远程server获取.这样做的 ...
- Spring Security 解析(七) —— Spring Security Oauth2 源码解析
Spring Security 解析(七) -- Spring Security Oauth2 源码解析 在学习Spring Cloud 时,遇到了授权服务oauth 相关内容时,总是一知半解,因 ...
随机推荐
- asp.net发布网站(转)
1. 在Web项目中点击发布网站,如图1所示 图1 2. 选择要发布的路径——>“确定”,如果项目显示发布成功就可以了.如图2所示 图2 3. 打 ...
- MVC4入门指南
本系列共10篇文章,翻译自Asp.Net MVC4 官方教程,由于本系列文章言简意赅,篇幅适中,从一个示例开始讲解,全文最终完成了一个管理影片的小系统,非常适合新手入门Asp.Net MVC4,并由此 ...
- iOS 饼状图
首先先看一下效果: 一.创建饼状图对象 创建饼状图对象用到类是PieChartView.h, 代码如下: self.pieChartView = [[PieChartView alloc] ini ...
- BZOJ 1218: [HNOI2003]激光炸弹( 前缀和 + 枚举 )
虽然source写着dp , 而且很明显dp可以搞...但是数据不大 , 前缀和 + 枚举也水的过去..... -------------------------------------------- ...
- 帝国cms分页样式修改文件-注意事项
帝国cms分页样式主要有:内容页分页样式.列表页分页样式以及默认搜索模板使用的搜索样式等几种. 要改这些样式其实也很简单,在网站目录中找到相应的.css文件修改empages属性就行了,但是这样比较麻 ...
- ASP.NET MVC5 学习笔记-4 OWIN和Katana
1. Owin OWIN全名:Open Web Interface for .NET. 它是一个说明,而非一个框架,该声明用来实现Web服务器和框架的松耦合.它提供了模块化.轻量级和便携的设计.类似N ...
- 自定义标签(TagSupport )
转载:http://zhuhuide2004.iteye.com/blog/555737 这个图太好了,拿下来,标注一下:
- Java算法——O(n)查询数列中出现超过半数的元素
主要思想: 相邻元素两两比较,如果相同存入新数组,不同二者都删除.如果 某数出现次数超高n/2,则最后剩下的1元素为所求. public static int findMostElem(final A ...
- CSS块级元素和行内元素
根据CSS规范的规定,每一个网页元素都有一个display属性,用于确定该元素的类型,每一个元素都有默认的display属性值,比如div元素,它的默认display属性值为“block”,成为“块级 ...
- 【源码】实现Android闹钟功能使用HTML+JS,并附带Alarm代码分享
先是开发手册中最终功能的实现函数,再是Alarm接口的源码. 参数: argu:型如“key1=value1;key2=value2;......”的参数表.首先,该参数表支持 rexseeNotif ...