volley-core2

Volley第三部分

core2.md 部分

4.2.8 NoCachce.java

继承与Cache类,不做任何操作的缓存实现类,可将它作为构建RequestQueue的参数以实现一个
不带缓存的请求队列。

4.2.9 Network.java

代表网络的接口,处理网络的请求。
唯一的方法,用于执行特定请求。

public NetworkResponse performRequest(Request<?> request) throws VolleyError; 
4.2.10 NetworkResponse.java

Network 中的方法performRequest的返回值,Request 的parseNetworkResponse(…) 方法入参,
是Volley 中用于内部Response 转换的一级
封装了网络请求响应的StatusCode,Headers和Body等。

1.成员变量

int statusCode Http 响应状态码  
byte[] data Body 数据  
Map<String, String> headers  响应Headers
boolean notModified  表示是否为304响应  
long networkTimeMs 请求耗时  

2.volley 的内部Response转换流程图

从上到下,表示从得到数据后一步一步的处理,箭头旁的注释表示该步处理后的实体类。

4.2.11 BasicNetwork.java

实现Network,Volley中默认的网络接口实现类。调用HttpStack处理请求,并将结果转换为可被
ResponseDelivery处理的NetworkResponse.

主要实现了以下功能:

  1. 利用HttpStack执行网络请求,
  2. 如果request中带有实体信息,如Etag,Last-Modify等,则进行缓存新鲜度的验证,
    并处理304(not modify)响应。
  3. 如果发生超时,认证失败等错误,进行重试操作,直到成功,抛出异常,结束。
4.2.12 HttpStack.java

用于处理http事件,返回请求结果的接口。目前Volley中实现有基于HttpURLConnection的HurlStack
和基于Apache HttpClientStack.
唯一方法,执行请求

public HttpResponse performRequest(Request<?> request, Map<String, String>
 additionalHeader) throws IOException, AuthFailureError;

执行Request代表的请求,第二个参数表示发起请求之前,添加额外的请求Headers.

4.2.13 HttpClientStack.java

实现HttpStack接口,利用Apache的HttpClient进行各种请求方式的请求。
基本就是org.apache.http 包下面相关类的常用方法,不过与下面HttpURLConnection 做下对比
就可以发现HttpURLConnection的API相对简单很多。

4.2.14 HurlStack.java

实现HttpStack 接口,利用iava的HttpURLConnection进行各种请求方式的请求。

4.2.15 Response.java

封装了经过解析后的数据,用于传输。并且有两个内部接口 Listener 和 ErrorListener
分别可表示请求失败和成功的回调。Response 的构造函数被私有化,而通过两个函数
名更易懂的静态方法构建对象。

4.2.16 ByteArrayPool.java

byte[]的回收池,用于byte[]的回收再利用,减少了内存的分配和回收。主要通过一个元素长度
从小到大排序的ArrayList作为byte[]的缓存,另有一个按时间先后排序的ArrayList属性用于缓存
满时清理元素。

public synchronized void returnBuf(byte[] buf) 

将用过的byte[]回收,根据byte[]长度按照从小到大的排序将byte[]插入到缓存中合适位置。

public synchronized byte[] getBuf(int len)

获取长度不小于len的byte[],遍历缓存,找出第一个长度大于传入参数len的byte[],并返回;
如果最终没有合适的byte[],new一个返回。

private synchronized void trim()

当缓存的byte超过预先设置的大小时,按照先进先出的顺序删除最早的byte[].

4.2.17 PoolingByteArrayOutputStream.java

继承ByteArrayOutputStream,原始 ByteArrayOutputStream 中用于接受写入 bytes 的 buf。
每次空间不足时便会 new 更大容量的 byte[],而 PoolingByteArrayOutputStream 使用了
ByteArrayPool 作为 Byte[] 缓存来减少这种操作,从而提高性能。

4.2.18 HttpHeaderParser.java

Http header的解析工具类,在volley中主要作用是用于解析Header从而判断返回结果是否需要
缓存,如果需要返回Header中相关信息。

有三个方法:

public static long parseDateAsEpoch(String dateStr)

解析时间,将RFC1123的时间格式,解析成epoch时间

public static String parseCharset(Map<String, String> headers)

解析编码集,在Content-Type首部获取编码集,如果没有找到,默认返回ISO-8859-1

public static Cache.Entry parseCacheHeaders(NetworkResponse response)

比较重要的方法,通过网络响应中的缓存控制Header和Body内容,构建缓存实体。
如果Header的Cache-Control 字段含有no-cache或no-store 表示不缓存,返回null。
1.根据Date首部,获取响应生成时间
2.根据ETag首部,获取响应实体标签
3.根据Cache-Control 和 Expires 首部,计算出缓存的过期时间和缓存的新鲜度时间。

注意一下:
  1. 没有处理Last-Modify首部,而是处理存储了Date首部,并在后续的新鲜度验证时,
    使用Date来构建If-Modified-Since, 这与Http的语义有些违背。
  2. 计算过期时间,Cache-Control 首部优先于Expires首部。
4.2.19 RetryPolicy.java

重试策略接口
有三种方法:

public int getCurrentTimeout();

获取当前请求用时(用于log)

public int getCurrentRetryCopunt();

获取已经重试的次数(用于log)

public void retry(VolleyError error ) throws VolleyError;

确定是否重载,参数为这次异常的具体信息,在请求异常时此接口会被调用,
可在此函数的现实中抛出传入的异常表示停止重试。

4.2.20 DefaultRetryPolicy.java

实现RetryPolicy, volley默认的重试策略实现类。主要通过在retry(…)函数中判断
重试次数是否达到上限确定是否继续重试。
其中 mCurrentRetryCount 变量表示已经重试的次数,mBackoffMultiplier 表示每次
重试之前的timeout该乘以的因子。mCurrentTimeoutMs 变量表示当前重试的timeout时间,
会以mBackoffMutiplier作为因子累计前几次重试的timeout。

4.2.21 ResponseDelivery.java

请求结果的传输接口,用于传递请求结果或者请求错误。
有三个方法:

public void postResponse(Request<?> request, Response<?> response);

此方法用于传递请求结果,request 和 response 参数分别表示请求信息和返回结果信息。

public void postResponse(Request<?> request,Response<?> response, Runnable runnable);

此方法用于传递请求结果,并在完成传递后执行 Runnable。

public void postError(Request<?> request, VolleyError error);

此方法用于传输请求错误。

4.2.22 ExecutorDelivery.java

请求结果传输接口具体实现类
在handler对应线程中传输缓存调度线程或者网络调度线程中产生的请求结果或请求错误,
会在请求成功的情况下调用Request.deliverResponse(…)函数,失败时调用Request.deliverError()

4.2.23 StringRequest.java

继承Request类,代表了一个返回值为String的请求,将网络返回的结果数据解析为String类型。
通过构造函数的listener传参,支持请求成功后的onResponse(…)回调。

4.2.24 JsonRequest.java

抽象类,继承自 Request,代表了 body 为 JSON 的请求。提供了构建 JSON 请求参数的方法.

4.2.25 JsonObjectRequest.java

继承自 JsonRequest,将网络返回的结果数据解析为 JSONObject 类型.

4.2.26 JsonArrayRequest.java

继承自 JsonRequest,将网络返回的结果数据解析为 JSONArray 类型。

4.2.27 ImageRequest.java

继承 Request 类,代表了一个返回值为 Image 的请求。将网络返回的结果数据解析为 Bitmap 类型
可以设置图片的最大宽度和最大高度,并计算出合适尺寸返回。每次最多解析一张图片防止 OOM.

4.2.28 ImageLoader.java

封装了ImageRequest 的方便使用的图片加载工具类。

  1. 可以设置自定义的ImageCache,可以是内存缓存,也可以是 Disk 缓存,将获取
    的图片缓存起来,重复利用,减少请求。
  2. 可以定义图片请求过程中显示的图片和请求失败后显示的图片
  3. 相同请求(相同地址,相同大小)只发送一个,可以避免重复请求。
4.2.29 NetworkImageView.java

利用ImageLoader,可以加载网络图片的ImageView
有三个公开的方法:

public void setDefaultImageResId(int defaultImage);

设置默认图片,加载图片过程中显示。

public void setImageUrl(String url, ImageLoader imageLoader)

设置网络图片的Url和ImageLoader, 将利用这个ImageLoader去获取网络图片。
如果有新的图片记载请求,会把这个ImageView上旧的加载请求取消。

waiting