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,使之有更多更完善的功能。

时间: 2024-08-01 22:45:29

volley源码解析(七)--最终目的之Response<T>的相关文章

Volley 源码解析&lt;转&gt;

Volley 源码解析 1. 功能介绍 1.1. Volley Volley 是 Google 推出的 Android 异步网络请求框架和图片加载框架.在 Google I/O 2013 大会上发布. 名字由来:a burst or emission of many things or a large amount at once发布演讲时候的配图 从名字由来和配图中无数急促的火箭可以看出 Volley 的特点:特别适合数据量小,通信频繁的网络操作.(个人认为 Android 应用中绝大多数的网

Android开发——Volley源码解析

0. 前言   其实写这篇文章只为一个目的,虽然Volley用起来很爽,但是面试官问你人家内部是怎么实现呢,没看过源码的话,在面试官眼里你和一个拿着一本Volley使用手册的高中生没啥区别.还是那句话说得好,会用一回事,深入理解又是另一回事了. 1.  Volley源码解析 1.1  Volley入口 Volley首先获取到的是RequestQueue实例.源码中则直接调用了newRequestQueue方法. public static RequestQueue newRequestQueue

Volley 源码解析(转自codeKK)

Volley 源码解析 本文为 Android 开源项目源码解析 中 Volley 部分项目地址:Volley,分析的版本:35ce778,Demo 地址:Volley Demo分析者:grumoon,校对者:huxian99.Trinea,校对状态:完成 1. 功能介绍 1.1. Volley Volley 是 Google 推出的 Android 异步网络请求框架和图片加载框架.在 Google I/O 2013 大会上发布. 名字由来:a burst or emission of many

Volley 源码解析

Volley 源码解析 本文为 Android 开源项目源码解析 中 Volley 部分项目地址:Volley,分析的版本:35ce778,Demo 地址:Volley Demo分析者:grumoon,校对者:huxian99.Trinea,校对状态:完成 1. 功能介绍 1.1. Volley Volley 是 Google 推出的 Android 异步网络请求框架和图片加载框架.在 Google I/O 2013 大会上发布. 名字由来:a burst or emission of many

Volley 源码解析(转)

项目:Volley,分析者:grumoon,校对者:Trinea 本文为 Android 开源项目源码解析 中 Volley 部分项目地址:Volley,分析的版本:35ce778,Demo 地址:Volley Demo分析者:grumoon,校对者:huxian99.Trinea,校对状态:完成 1. 功能介绍 1.1. Volley Volley 是 Google 推出的 Android 异步网络请求框架和图片加载框架.在 Google I/O 2013 大会上发布. 名字由来:a burs

Volley源码解析

Volley源码分为两部分 1.核心类库(主要以接口为主)   2.各接口实现类.工具类          第2部分以实现接口.提供工具为主,不影响数据流转,所以我们可以暂时先不管.看第1部分,很多Error.Log暂时先不看,比较外围.剩下的类,贴个UML如下 各接口&类解释Network:通过网络(HttpURLConnection或者HttpClient),发送请求并得到应答Cache:提供缓存功能,主要为get.put两个方法设置和获取缓存NetworkDispatcher:获取网络侧阻

volley源码解析(二)--Request&lt;T&gt;类的介绍

在上一篇文章中,我们已经提到volley的使用方式和设计的整体思路,从这篇文章开始,我就要结合具体的源码来给大家说明volley功能的具体实现. 我们第一个要介绍的类是Request<T>这个一个抽象类,我将Request称为一个请求,通过继承Request<T>来自定义request,为volley提供了更加灵活的接口. Request<T>中的泛型T,是指解析response以后的结果.在上一篇文章中我们知道,ResponseDelivery会把response分派

Volley源码解析——从实现角度深入剖析volley

本文从实现角度详细讲解了volley框架,读者需要有对基本的volley使用和handler机制有一定的了解,主要目的是研究volley的实现思路,在理解代码的基础上会思考为什么要这么写,很多地方都需要读者先大概地阅读一下贴出的源码.由于第一次写框架分析的博文,有些地方解释得可能不是很清楚,希望大家能谅解 1.入口类Volley 像很多框架.SDK一样,volley使用了facade设计模式,提供Volley类来简化volley的使用,Volley.newRequestQueue源码如下 pub

Android开发学习之路-Volley源码解析

从简单的StringRequest入手看看Volley的工作机制. 先简单说下Volley的用法: ① 获取一个RequestQueue mRequestQueue = Volley.newRequestQueue(this); ② 构造一个StringRequest对象 mStringRequest = new StringRequest(url, new Response.Listener<String>() { @Override public void onResponse(Strin