3. NetworkNetworkResponse

参考链接:

%20%E6%BA%90%E7%A0%81%E8%A7%A3%E6%9E%90

1.Network

Network是一个接口,包含唯一一个方法performRequest,该方法执行request,并返回一个NetworkResponse。Volley中默认使用BasicNetwork类implement该接口。在BasicNetwork的performRequest中,其通过httpResponse =mHttpStack.performRequest(request, headers);获取httpResponse,其中mHttpStack是一个HttpStack接口,其具体实现由Android版本号决定(Volley.java):

if (Build.VERSION.SDK_INT >= 9) {stack = new HurlStack();} else {// Prior to Gingerbread, HttpUrlConnection was unreliable.// See: stack = new HttpClientStack(AndroidHttpClient.newInstance(userAgent));}

现在大多为HttpURLConnection,也就是code中的HurlStack,其利用HttpURLConnection中的API执行网络请求,并在执行完成后返回HttpResponse类。若HttpResponse类通信正常,则将其中的内容解析出来,封装为NetworkResponse类返回。

2.NetworkResponse

NetworkResponse的构造函数之一为:

public NetworkResponse(int statusCode, byte[] data, Map<String, String> headers,boolean notModified)

主要包含四个变量:int statusCode-HTTP状态码、byte[] data-response中的原始数据(Raw Data)、Map<String,String> headers-返回头、boolean notModified-服务器是否返回304。

304 的标准解释是:NotModified 客户端有缓冲的文档并发出了一个条件性的请求(一般是提供If-Modified-Since头表示客户只想比指定日期更新的文档)。服务器告诉客户,原来缓冲的文档还可以继续使用。

3.Request-解析NetworkResponse

Request中有这么一个函数:

abstract protected Response<T>parseNetworkResponse(NetworkResponse response);

接下来以StringRequest为例,看看其是如何对NetworkResponse进行解析的:

protected Response<String> parseNetworkResponse(NetworkResponse response) {String parsed;try {parsed = new String(response.data, HttpHeaderParser.parseCharset(response.headers));} catch (UnsupportedEncodingException e) {parsed = new String(response.data);}return Response.success(parsed, HttpHeaderParser.parseCacheHeaders(response));}

回到NetworkDispatcher的run中,在其通过:

Response<?>response = request.parseNetworkResponse(networkResponse);

获得解析出的Response后,,执行mDelivery.postResponse(request, response)。其中mDelivery的类型为ResponseDelivery,这是一个接口。查看NetworkDispatcher.java的代码可看到mDelivery在其构造函数中被初始化:

public NetworkDispatcher(BlockingQueue<Request> queue,Network network, Cache cache,ResponseDelivery delivery) {mQueue = queue;mNetwork = network;mCache = cache;mDelivery = delivery;}

NetworkDispatcher的start在RequestQueue.java的start中:

public void start() {stop(); // Make sure any currently running dispatchers are stopped.// Create the cache dispatcher and start it.mCacheDispatcher = new CacheDispatcher(mCacheQueue, mNetworkQueue, mCache, mDelivery);mCacheDispatcher.start();// Create network dispatchers (and corresponding threads) up to the pool size.for (int i = 0; i < mDispatchers.length; i++) {NetworkDispatcher networkDispatcher = new NetworkDispatcher(mNetworkQueue, mNetwork,mCache, mDelivery);mDispatchers[i] = networkDispatcher;networkDispatcher.start();}}

查看RequestQueue的构造函数可知mDelivery是:new ExecutorDelivery(new Handler(Looper.getMainLooper()

ExecuteDelivery中的postResponse函数执行了:mRequest.deliverResponse(mResponse.result);在StringRequest中,deliverResponse回调了onResponse函数:mListener.onResponse(response);

图示Volley(图源自codekk的volley源码解析:

%20%E6%BA%90%E7%A0%81%E8%A7%A3%E6%9E%90)

总体设计图:

流程图:

类关系图:

缘是浪漫的相遇,瞬间让你我的心化为永恒!

3. NetworkNetworkResponse

相关文章:

你感兴趣的文章:

标签云: