volley介绍08

-----------------------------------------------------------------------------------

转载:http://blog.csdn.net/crazy__chen/article/details/46612901

-----------------------------------------------------------------------------------

在上篇文章中,我们最终通过网络,获取到了HttpResponse对象

HttpResponse是android包里面的一个类,然后为了更高的扩展性,我们在BasicNetwork类里面看到,Volley将其包装成一个Volley自己的对象NetworkResponse

另外,在BasicNetwork类中我们也注意到,对HttpResponse包装成NetworkResponse的过程中,使用HttpResponse的Inputstream,将数据保存在一个byte[]数组中。

BasicNetwork代码片段:

[java] view plain copy

  1. // Some responses such as 204s do not have content.  We must check.
  2. if (httpResponse.getEntity() != null) {//返回响应主体
  3. responseContents = entityToBytes(httpResponse.getEntity());//将主体转换byte[]形式
  4. } else {//没有返回内容
  5. // Add 0 byte response as a way of honestly representing a
  6. // no-content request.
  7. responseContents = new byte[0];
  8. }

这样可能造成的一个问题,就是内存溢出,这也是Volley之所以不能用来下载大文件的原因,因为byte[]是保存在内存中的。

好了,下面让我们来看NetworkResponse的源码

[java] view plain copy

  1. /**
  2. * The HTTP status code.
  3. * http状态码
  4. */
  5. public final int statusCode;
  6. /**
  7. * Raw data from this response.
  8. * 数据
  9. */
  10. public final byte[] data;
  11. /**
  12. * Response headers.
  13. * 响应头
  14. */
  15. public final Map<String, String> headers;
  16. /**
  17. * True if the server returned a 304 (Not Modified).
  18. * 网页是否修改.304
  19. */
  20. public final boolean notModified;
  21. /**
  22. * Network roundtrip time in milliseconds.
  23. * 响应时间
  24. */
  25. public final long networkTimeMs;
  26. /**
  27. * Creates a new network response.
  28. * @param statusCode the HTTP status code
  29. * @param data Response body
  30. * @param headers Headers returned with this response, or null for none
  31. * @param notModified True if the server returned a 304 and the data was already in cache
  32. * @param networkTimeMs Round-trip network time to receive network response
  33. */
  34. public NetworkResponse(int statusCode, byte[] data, Map<String, String> headers,
  35. boolean notModified, long networkTimeMs) {
  36. this.statusCode = statusCode;
  37. this.data = data;
  38. this.headers = headers;
  39. this.notModified = notModified;
  40. this.networkTimeMs = networkTimeMs;
  41. }

本质上没有什么特别的,只是将HttpResponse的内容,简单地转移到NetworkResponse中

接下来,在响应分发过程中,request负责把NetworkResponse又包装成Response<T>对象

NetworkDispatcher代码片段:

[java] view plain copy

  1. // Parse the response here on the worker thread. 解析网络响应到本地
  2. 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-10-24 02:42:07

volley介绍08的相关文章

volley介绍06

----------------------------------------------------------------------------- 转载:http://blog.csdn.net/crazy__chen/article/details/46506921 ----------------------------------------------------------------------------- 上一篇文章当中,我介绍了CacheDispatcher和缓存类Ca

volley介绍04

------------------------------------------------------------------------------- 转载:http://blog.csdn.net/crazy__chen/article/details/46490635 ------------------------------------------------------------------------------- 上一篇文章给大家说明了Request<T>的内部结构,对

volley介绍03

------------------------------------------------------------------------------ 转载:http://blog.csdn.net/crazy__chen/article/details/46486123 ------------------------------------------------------------------------------ 在上一篇文章中,我们已经提到volley的使用方式和设计的整体

volley介绍05

---------------------------------------------------------------------------------- 转载:http://blog.csdn.net/crazy__chen/article/details/46494627 ---------------------------------------------------------------------------------- 从上一篇文章我们已经知道,现在要处理的问题就是

GoogleIO 2013 Android快速联网框架Volley介绍

最近调研Android开发框架,看了xutils,KjFramework等框架的HTTP模块,觉得都太简单了,只是简单封装了HttpUrlConnenction和Handler,加了个回调函数,感觉就是比自己写一个好一点点.后面发现了Volley这个比较靠谱的Android网络请求框架,就用它了. Volley是Android平台上的网络通信库,能使网络通信更快,更简单,更健壮. 这是Volley名称的由来: a burst or emission of many things or a lar

Android Volley入门到精通:初识Volley的基本用法

1. Volley简介 我们平时在开发Android应用的时候不可避免地都需要用到网络技术,而多数情况下应用程序都会使用HTTP协议来发送和接收网络数据.Android系统中主要提供了两种方式来进行HTTP通信,HttpURLConnection和HttpClient,几乎在任何项目的代码中我们都能看到这两个类的身影,使用率非常高. 不过HttpURLConnection和HttpClient的用法还是稍微有些复杂的,如果不进行适当封装的话,很容易就会写出不少重复代码.于是乎,一些Android

【Android高级】应用开发必须要掌握的框架&lt;Volley&gt;

开发久了,就会发现掌握一个好的应用框架是多么的重要,虽然是别人的东西,你也许不能完全搞懂其中的原理,但你知道如何利用其到自己的开发中,这样不仅能节省大量的时间,而且别人沉淀下来的精华效果一定比他的厉害之处.Volley就是一个这么好的一个东西,发现两个大神总结的太好,我再总结就感觉造次了,详解如下所示: 1.Volley介绍 2.Volley用法 版权声明:本文为博主原创文章,未经博主允许不得转载.

volley 讲解

总结的不错的Volley介绍: Volley主页 https://android.googlesource.com/platform/frameworks/volley http://www.youtube.com/watch?v=yhv8l9F44qo&feature=player_embedded 1. 什么是Volley 在这之前,我们在程序中需要和网络通信的时候,大体使用的东西莫过于AsyncTaskLoader,HttpURLConnection,AsyncTask,HTTPClien

Android框架-Volley(一)

1. Volley简介 我们平时在开发Android应用的时候不可避免地都需要用到网络技术,而多数情况下应用程序都会使用HTTP协议来发送和接收网络数据.Android系统中主要提供了两种方式来进行HTTP通信,HttpURLConnection和HttpClient,几乎在任何项目的代码中我们都能看到这两个类的身影,使用率非常高. 不过HttpURLConnection和HttpClient的用法还是稍微有些复杂的,如果不进行适当封装的话,很容易就会写出不少重复代码.于是乎,一些Android