Http 请求的基本过程
volley 的 初始化 RequestQueue requestQueue = Volley.newRequestQueue(context),
返回的是一个 RequestQueue 对象,这个对象的作用下面再说。现在进入到方法的内部可以看到
这么几个重载的方法:
public static RequestQueue newRequestQueue(Context context) {
return newRequestQueue(context, null);
}
public static RequestQueue newRequestQueue(Context context, HttpStack stack)
{
return newRequestQueue(context, stack, -1);
}
public static RequestQueue newRequestQueue(Context context, HttpStack stack, int maxDiskCacheBytes) {
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);
此时我们看看 HttpClientStack类,那么这个类是做什么的呢?
public class HttpClientStack implements HttpStack
HttpStack 是一个接口 仅仅只有一个方法:
public HttpResponse performRequest(Request<?> request, Map<String, String> additionalHeaders)
throws IOException, AuthFailureError;
[align=left][/align]
参数是一个Request<?>的对象 这是一个泛型,它的作用下面再说。
那么这个方法译为中文就是:执行请求。
在HttpClientStack 中 performRequest的具体实现如下:
@Override
public HttpResponse performRequest(Request<?> request, Map<String, String> additionalHeaders)
throws IOException, AuthFailureError {
HttpUriRequest httpRequest = createHttpRequest(request, additionalHeaders);
addHeaders(httpRequest, additionalHeaders);
addHeaders(httpRequest, request.getHeaders());
onPrepareRequest(httpRequest);
HttpParams httpParams = httpRequest.getParams();
int timeoutMs = request.getTimeoutMs();
// TODO: Reevaluate this connection timeout based on more wide-scale
// data collection and possibly different for wifi vs. 3G.
HttpConnectionParams.setConnectionTimeout(httpParams, 5000);
HttpConnectionParams.setSoTimeout(httpParams, timeoutMs);
return mClient.execute(httpRequest);
}
protected final HttpClient mClient;
直到这时候,才发现Volley 默认使用的是apache Http Client框架,记得很早以前看到一篇文章说Android开发团队 推荐使用java.net 包中的HttpUrlConnection作为网络请求的方式,针对android 平台做过优化,却不知为何在Volley中 还是默认使用HttpClient?
再来看看Network 接口;
public NetworkResponse performRequest(Request<?> request) throws VolleyError;
仍然只有一个执行请求的方法。
在实现类BasicNetwork 的构造方法中,HttpStack 被作为了参数。
@Override
public NetworkResponse performRequest(Request<?> request) throws VolleyError {
long requestStart = SystemClock.elapsedRealtime();
while (true) {
HttpResponse httpResponse = null;
byte[] responseContents = null;
Map<String, String> responseHeaders = Collections.emptyMap();
try {
// Gather headers.
Map<String, String> headers = new HashMap<String, String>();
addCacheHeaders(headers, request.getCacheEntry());
httpResponse = mHttpStack.performRequest(request, headers);
StatusLine statusLine = httpResponse.getStatusLine();
int statusCode = statusLine.getStatusCode();
.....
}
看到这里 我们似乎明白了volley 对http请求的调用顺序是:
Network ----> HttpStack---->HttpClient
如果读者细心会发现,现有的网络执行过程中,不支持上传文件等属性,
在Volley 初始化 请求队列的时候,有一个重载方法:
public static RequestQueue newRequestQueue(Context context,
HttpStack stack)
{
return newRequestQueue(context, stack, -1);
}
那么要实现更复杂的网络请求, 只需要实现自己的HttpStack 在
performRequest() 方法中灵活实现即可满足需求。
Volley 的 Request对象
阅读源代码 我们发现
public abstract class Request<T> implements Comparable<Request<T>>
Request 是一个泛型的抽象类,且是可比较的。
那么为什么要实现 Comparable接口呢?
我的理解是要避免重复请求。
public interface Method {
int DEPRECATED_GET_OR_POST = -1;
int GET = 0;
int POST = 1;
int PUT = 2;
int DELETE = 3;
int HEAD = 4;
int OPTIONS = 5;
int TRACE = 6;
int PATCH = 7;
}
在Request中 有Method接口 定义了支持的Http请求方法。
abstract protected Response<T> parseNetworkResponse(NetworkResponse response);
这是一个抽象方法,那么要实现自定义的请求 就必须实现这个方法。如GsonRequest,ImageRequest等等。
发送Post请求必须重写getPostParams()方法:
@Deprecated
protected Map<String, String> getPostParams() throws AuthFailureError {
return getParams();
}
至此,对Volley 的网络请求的过程以及源码的分析 告一段落。
下一节 请求队列 RequestQueue
http://f303153041.iteye.com/blog/2281350
分享到:
相关推荐
在压缩包中的"Volley.jar"是Volley库的编译结果,可以直接导入到Android项目中使用,无需解析源码。使用jar包时,开发者可以直接调用Volley提供的API,如`RequestQueue.add(Request)`来添加请求,或者使用`...
Volley源码解析是理解其工作原理、优化网络请求的关键,下面我们将深入探讨Volley的核心组件、工作流程以及关键算法。 首先,Volley的核心组件包括RequestQueue、Network、Cache和ResponseDelivery。RequestQueue是...
首先,Volley的核心特点包括: 1. **缓存机制**:Volley提供了内存和磁盘缓存策略,能够快速响应网络请求,减少对服务器的依赖,提高用户体验。 2. **线程管理**:Volley内部使用了线程池来处理网络请求,确保在...
5. **强大的转换能力**:Volley支持多种数据格式,如JSON、XML等,可以自动解析响应数据,无需额外的解析步骤。 6. **错误处理**:Volley提供了统一的错误处理机制,方便开发者捕获和处理网络请求过程中可能出现的...
Volley是Google推荐的一款高效的Android网络请求库,它专注于提供快速、流畅的网络通信体验,尤其适合处理大量的小数据请求。Volley的核心设计理念是优化UI线程的性能,减少网络延迟对用户界面的影响,以及通过缓存...
在深入了解Volley的源码之前,我们先来概述一下Volley的基本概念和核心功能。 Volley的主要目标是简化Android应用中的网络请求处理,提供了一套高效的网络请求管理机制,包括异步处理、缓存策略、错误处理和性能...
Volley的核心特性包括: 1. **缓存策略**: - Volley提供了基于内存和磁盘的两级缓存机制,能够快速响应网络请求,减少对服务器的压力。内存缓存用于存储最近访问的数据,磁盘缓存则用于长期存储,即使应用关闭也...
无论你是初学者还是经验丰富的开发者,研究Volley源码都是一项值得投入的时间和精力的工作。通过深入学习,你可以了解到Android网络编程的最佳实践,以及如何构建一个高性能、易用的网络请求框架。
Volley 的核心优势在于其对网络请求的优化、内存管理以及线程调度策略。 1. **RequestQueue**:这是 Volley 的主要入口点,负责管理多个 CacheDispatcher 和 NetworkDispatcher 线程,处理请求队列。RequestQueue ...
Volley是一款由Google开发的高效的Android网络请求库,它的设计目标是简化常见的网络...这个"可查看Volley源码"的demo是一个宝贵的教育资源,对于想要深入理解Android网络编程的开发者来说,是一份不可多得的学习资料。
Volley是Google推出的一款高效的网络请求库,专为Android平台设计。...通过深入理解Volley的源码,开发者可以更好地利用其特性,提升应用的网络性能。提供的文档将帮助你理解和应用这些知识点,解决实际开发中的问题。
- 数据解析:Volley支持多种数据格式,如JSON、XML,可以直接转换为Java对象。 - 取消请求:可以轻松取消不再需要的请求,避免资源浪费。 2. OkHttp是Square公司开发的一个高效的HTTP客户端,其设计理念是减少...
- **初始化RequestQueue**:在应用程序的初始化阶段,创建一个RequestQueue实例,这是Volley的核心组件。 ```java RequestQueue queue = Volley.newRequestQueue(context); ``` - **创建网络请求**:Volley提供了...
Volley框架的源码分析可以帮助开发者深入理解其工作原理,从而更好地优化网络请求性能,例如调整缓存策略、定制网络栈或实现自定义的解析器。通过对源码的学习,开发者还可以解决Volley在特定场景下可能遇到的问题,...
Volley是Google推出的一款高效的Android网络请求库,它旨在简化网络数据的获取和处理过程,提高了应用程序的响应速度和用户体验。...因此,研究Volley源码对于Android开发人员来说是一次非常有价值的探索。