概述
Network是volley定义的一个用来实现Request处理的接口。
public interface Network {
/**
* Performs the specified request.
* @param request Request to process
* @return A {@link NetworkResponse} with data and caching metadata; will never be null
* @throws VolleyError on errors
*/
public NetworkResponse performRequest(Request<?> request) throws VolleyError;
}
这其中涉及到两个类,Request即是请求,NetworkResponse是volley中对网络请求结果反馈的定义。
Request放到后续再说。NetworkResponse的定义其实很简单,用到的时候再看好了。主要还是要看下volley对Network的默认实现–BasicNetwork。
BasicNetwork
核心成员:HttpStack。
HttpStack仅仅是一个处理Request的接口。乍一看和Network蛮像。
public interface HttpStack {
/**
* Performs an HTTP request with the given parameters.
*
* <p>A GET request is sent if request.getPostBody() == null. A POST request is sent otherwise,
* and the Content-Type header is set to request.getPostBodyContentType().</p>
*
* @param request the request to perform
* @param additionalHeaders additional headers to be sent together with
* {@link Request#getHeaders()}
* @return the HTTP response
*/
public HttpResponse performRequest(Request<?> request, Map<String, String> additionalHeaders)
throws IOException, AuthFailureError;
}
但其返回值是HttpResponse。HttpResponse也是一个接口,位于org.apache.http包下,想来是对http反馈的通用定义。BasicNetwork的作用就是把HttpStack的返回值转换成volley定义的标准–NetworkResponse。HttpStack其实才是BasicNetwork这个Network的默认实现的底层实现。BasicNetwork的核心是对performRequest的实现,而其performRequest其实就是通过HttpStack来获取HttpResponse,然后将其转换为NetworkResponse。
HttpStack
HttpStack定义了对Request的底层实现的接口,对其的实现volley根据sdk版本不同提供两种不同方案,当然也可以自己定义实现。
public static RequestQueue newRequestQueue(Context context, HttpStack stack) {
File cacheDir = new File(context.getCacheDir(), DEFAULT_CACHE_DIR);
String userAgent = "volley/0";
try {
String packageName = context.getPackageName();
PackageInfo info = context.getPackageManager().getPackageInfo(packageName, 0);
userAgent = packageName + "/" + info.versionCode;
} catch (NameNotFoundException e) {
}
if (stack == null) {
if (Build.VERSION.SDK_INT >= 9) {
stack = new HurlStack();
} else {
// Prior to Gingerbread, HttpUrlConnection was unreliable.
// See: http://android-developers.blogspot.com/2011/09/androids-http-clients.html
stack = new HttpClientStack(AndroidHttpClient.newInstance(userAgent));
}
}
Network network = new BasicNetwork(stack);
RequestQueue queue = new RequestQueue(new DiskBasedCache(cacheDir), network);
queue.start();
return queue;
}
版本小于9以前的老古董不做讨论了,其它的volley默认提供HurlStack来实现HttpStack。
HurlStack
HurlStack的核心就是对performRequest的实现。
而其performRequest其实使用的是HttpURLConnection来完成最终http操作。关于HttpURLConnection,android在4.0的某个版本之后底层就采用OkHttp来实现了,这一点可以从打印的调试信息看出。
HttpURLConnection操作的步骤:1)openConnection;2)为connection添加headers;3)调用setConnectionParametersForRequest为connection设置方法和参数,再通过DataOutputStream发送数据;4)获取反馈。
技术细节
1,DataOutputStream相关细节。
2,由于http实际是一次性将数据发出的,而HttpURLConnection使用步骤中分了open和添加body,则实际的链接建立和数据发送到底在何处开始。我觉得应该是在调用getResponseCode获取反馈的时候,getResponseCode应该是会引起blocking的。