[Android]Volley源码分析(四)
上篇中有提到NetworkDispatcher是通过mNetwork(Network类型)来进行网络访问的,现在来看一下关于Network是如何进行网络访问的。
Network部分的类图:
aaarticlea/png;base64,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" alt="" />
Network有一个实现类BasicNetwork,它有一个mHttpStack的属性,实际的网络请求是由这个mHttpStack来进行的,看BasicNetwork的performRequest()方法,
@Override
public NetworkResponse performRequest(Request<?> request) throws VolleyError {
long requestStart = SystemClock.elapsedRealtime();
while (true) {
HttpResponse httpResponse = null;
byte[] responseContents = null;
Map<String, String> responseHeaders = new HashMap<String, String>();
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(); responseHeaders = convertHeaders(httpResponse.getAllHeaders());
// Handle cache validation.
if (statusCode == HttpStatus.SC_NOT_MODIFIED) {
return new NetworkResponse(HttpStatus.SC_NOT_MODIFIED,
request.getCacheEntry() == null ? null : request.getCacheEntry().data,
responseHeaders, true);
} // Some responses such as 204s do not have content. We must check.
if (httpResponse.getEntity() != null) {
responseContents = entityToBytes(httpResponse.getEntity());
} else {
// Add 0 byte response as a way of honestly representing a
// no-content request.
responseContents = new byte[];
} // if the request is slow, log it.
long requestLifetime = SystemClock.elapsedRealtime() - requestStart;
logSlowRequests(requestLifetime, request, responseContents, statusLine); if (statusCode < || statusCode > ) {
throw new IOException();
}
return new NetworkResponse(statusCode, responseContents, responseHeaders, false);
}
//一堆catch...
}
可以看到,在该方法中,实际是调用了mHttpStack.performRequest(request, headers);来进行网络访问,并对访问结果进行处理,貌似用的是Decorator模式。
如果状态码是304(HttpStatus.SC_NOT_MODIFIED)表示从上次访问后,服务器数据没有改变,则从Cache中拿数据。
【304(未修改)自从上次请求后,请求的网页未修改过。服务器返回此响应时,不会返回网页内容。如果网页自请求者上次请求后再也没有更改过,您应将服务器配置为返回此响应(称为 If-Modified-Since HTTP 标头)。服务器可以告诉客户端自从上次抓取后网页没有变更,进而节省带宽和开销。】
再来看HttpStack部分, HttpStack有两个实现类:HttpClientStack,HurlStack。分别通过HttpClient与HttpURLConnection来进行网络请求。
来看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, );
HttpConnectionParams.setSoTimeout(httpParams, timeoutMs);
return mClient.execute(httpRequest);
} /**
* Creates the appropriate subclass of HttpUriRequest for passed in request.
*/
@SuppressWarnings("deprecation")
/* protected */ static HttpUriRequest createHttpRequest(Request<?> request,
Map<String, String> additionalHeaders) throws AuthFailureError {
switch (request.getMethod()) {
case Method.DEPRECATED_GET_OR_POST: {
// This is the deprecated way that needs to be handled for backwards compatibility.
// If the request's post body is null, then the assumption is that the request is
// GET. Otherwise, it is assumed that the request is a POST.
byte[] postBody = request.getPostBody();
if (postBody != null) {
HttpPost postRequest = new HttpPost(request.getUrl());
postRequest.addHeader(HEADER_CONTENT_TYPE, request.getPostBodyContentType());
HttpEntity entity;
entity = new ByteArrayEntity(postBody);
postRequest.setEntity(entity);
return postRequest;
} else {
return new HttpGet(request.getUrl());
}
}
case Method.GET:
return new HttpGet(request.getUrl());
case Method.DELETE:
return new HttpDelete(request.getUrl());
case Method.POST: {
HttpPost postRequest = new HttpPost(request.getUrl());
postRequest.addHeader(HEADER_CONTENT_TYPE, request.getBodyContentType());
setEntityIfNonEmptyBody(postRequest, request);
return postRequest;
}
case Method.PUT: {
HttpPut putRequest = new HttpPut(request.getUrl());
putRequest.addHeader(HEADER_CONTENT_TYPE, request.getBodyContentType());
setEntityIfNonEmptyBody(putRequest, request);
return putRequest;
}
case Method.HEAD:
return new HttpHead(request.getUrl());
case Method.OPTIONS:
return new HttpOptions(request.getUrl());
case Method.TRACE:
return new HttpTrace(request.getUrl());
case Method.PATCH: {
HttpPatch patchRequest = new HttpPatch(request.getUrl());
patchRequest.addHeader(HEADER_CONTENT_TYPE, request.getBodyContentType());
setEntityIfNonEmptyBody(patchRequest, request);
return patchRequest;
}
default:
throw new IllegalStateException("Unknown request method.");
}
}
通过request的mMethod属性来生成相应的HttpUriRequest, 然后通过成员属性mClient(HttpClient类型)的execute()方法来执行网络请求。
接着看HurlStack的performRequest()方法
@Override
public HttpResponse performRequest(Request<?> request, Map<String, String> additionalHeaders)
throws IOException, AuthFailureError {
String url = request.getUrl();
HashMap<String, String> map = new HashMap<String, String>();
map.putAll(request.getHeaders());
map.putAll(additionalHeaders);
if (mUrlRewriter != null) {
String rewritten = mUrlRewriter.rewriteUrl(url);
if (rewritten == null) {
throw new IOException("URL blocked by rewriter: " + url);
}
url = rewritten;
}
URL parsedUrl = new URL(url);
HttpURLConnection connection = openConnection(parsedUrl, request);
for (String headerName : map.keySet()) {
connection.addRequestProperty(headerName, map.get(headerName));
}
setConnectionParametersForRequest(connection, request);
// Initialize HttpResponse with data from the HttpURLConnection.
ProtocolVersion protocolVersion = new ProtocolVersion("HTTP", , );
int responseCode = connection.getResponseCode();
if (responseCode == -) {
// -1 is returned by getResponseCode() if the response code could not be retrieved.
// Signal to the caller that something was wrong with the connection.
throw new IOException("Could not retrieve response code from HttpUrlConnection.");
}
StatusLine responseStatus = new BasicStatusLine(protocolVersion,
connection.getResponseCode(), connection.getResponseMessage());
BasicHttpResponse response = new BasicHttpResponse(responseStatus);
response.setEntity(entityFromConnection(connection));
for (Entry<String, List<String>> header : connection.getHeaderFields().entrySet()) {
if (header.getKey() != null) {
Header h = new BasicHeader(header.getKey(), header.getValue().get());
response.addHeader(h);
}
}
return response;
}
也是根据request的mMethod属性来生成相应的HttpURLConnection,通过HttpURLConnection来进行网络请求。
那么什么时候使用HttpClientStack(即使用HttpClient),什么时候使用HurlStack(即使用HttpURLConnection)呢? 来看一个叫做Volley的工具类
public class Volley {
/** Default on-disk cache directory. */
private static final String DEFAULT_CACHE_DIR = "volley";
/**
* Creates a default instance of the worker pool and calls {@link RequestQueue#start()} on it.
*
* @param context A {@link Context} to use for creating the cache dir.
* @param stack An {@link HttpStack} to use for the network, or null for default.
* @return A started {@link RequestQueue} instance.
*/
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, );
userAgent = packageName + "/" + info.versionCode;
} catch (NameNotFoundException e) {
}
if (stack == null) {
25 if (Build.VERSION.SDK_INT >= 9) {
26 stack = new HurlStack();
27 } else {
28 // Prior to Gingerbread, HttpUrlConnection was unreliable.
29 // See: http://android-developers.blogspot.com/2011/09/androids-http-clients.html
30 stack = new HttpClientStack(AndroidHttpClient.newInstance(userAgent));
31 }
}
Network network = new BasicNetwork(stack);
RequestQueue queue = new RequestQueue(new DiskBasedCache(cacheDir), network);
queue.start();
return queue;
}
/**
* Creates a default instance of the worker pool and calls {@link RequestQueue#start()} on it.
*
* @param context A {@link Context} to use for creating the cache dir.
* @return A started {@link RequestQueue} instance.
*/
public static RequestQueue newRequestQueue(Context context) {
return newRequestQueue(context, null);
}
}
在它的新建一个请求队列的方法newRequestQueue(Context context, HttpStack stack)中,如果没有指定stack,则根据Android SDK的版本来决定使用HttpClientStack还是HurlStack。SDK版本大于等于9(9对应的应该是Android2.3-2.3.2 GingerBread)的时候使用的是HurlStack,小于9的时候使用的是HttpClientStack。
在第一篇的RequestManager中,初始化Volley是如下所示代码,所以得知,如果Android版本是2.3或以后的就使用HurlStack, 低于2.3版本的就使用HttpClientStack来进行网络请求。
public static void init(Context context) {
mRequestQueue = Volley.newRequestQueue(context);
}
至于为什么要这样做,可以参考http://www.eoeandroid.com/thread-314728-1-1.html或原文http://android-developers.blogspot.com/2011/09/androids-http-clients.html(貌似需要翻墙,把内容贴到下面)
总结如下:
1. HttpClient由于API繁多,所以很难在不破坏兼容性的情况下对它进行优化,所以Android团队对它的优化与改进不是很积极。
2. HttpURLConnection因为API简单,所以对它进行升级优化比较容易。
3. 在Froyo之前,HttpURLConnection有一些bug,尤其是对一个可读的InputStream调用close会污染整个连接池,使得只能通过禁用连接池来解决它。
4. 在Gingerbread中,HttpURLConnection会自动地将这个header Accept-Encoding: gzip 加入请求并处理相应的经过压缩的响应。在Https连接方面也做了一些改进,HttpURLConnection会尝试通过SNI来进行连接, SNI可以使多个Https主机共享一个IP地址。如果连接失败,也能自动重试。
5. 在Ice Cream Sandwich中,增加了响应缓存。
6. 在Froyo或之前的版本中,最好使用HttpClient,因为它bug很少,而HttpURLConnection却有如3中的bug,Gingerbread或以上的版本,则应该使用HttpURLConnection,HttpURLConnection也是Android团队愿意花精力去优化与改进的。
Android’s HTTP Clients
[This post is by Jesse Wilson from the Dalvik team. —Tim Bray]
Most network-connected Android apps will use HTTP to send and receive data. Android includes two HTTP clients: HttpURLConnection and Apache HTTP Client. Both support HTTPS, streaming uploads and downloads, configurable timeouts, IPv6 and connection pooling.
Apache HTTP Client
DefaultHttpClient and its sibling AndroidHttpClient are extensible HTTP clients suitable for web browsers. They have large and flexible APIs. Their implementation is stable and they have few bugs.
But the large size of this API makes it difficult for us to improve it without breaking compatibility. The Android team is not actively working on Apache HTTP Client.
HttpURLConnection
HttpURLConnection is a general-purpose, lightweight HTTP client suitable for most applications. This class has humble beginnings, but its focused API has made it easy for us to improve steadily.
Prior to Froyo, HttpURLConnection had some frustrating bugs. In particular, calling close() on a readable InputStream couldpoison the connection pool. Work around this by disabling connection pooling:
private void disableConnectionReuseIfNecessary() {
// HTTP connection reuse which was buggy pre-froyo
if (Integer.parseInt(Build.VERSION.SDK) < Build.VERSION_CODES.FROYO) {
System.setProperty("http.keepAlive", "false");
}
}
In Gingerbread, we added transparent response compression. HttpURLConnection will automatically add this header to outgoing requests, and handle the corresponding response:
Accept-Encoding: gzip
Take advantage of this by configuring your Web server to compress responses for clients that can support it. If response compression is problematic, the class documentation shows how to disable it.
Since HTTP’s Content-Length header returns the compressed size, it is an error to use getContentLength() to size buffers for the uncompressed data. Instead, read bytes from the response until InputStream.read() returns -1.
We also made several improvements to HTTPS in Gingerbread. HttpsURLConnection attempts to connect with Server Name Indication (SNI) which allows multiple HTTPS hosts to share an IP address. It also enables compression and session tickets. Should the connection fail, it is automatically retried without these features. This makes HttpsURLConnection efficient when connecting to up-to-date servers, without breaking compatibility with older ones.
In Ice Cream Sandwich, we are adding a response cache. With the cache installed, HTTP requests will be satisfied in one of three ways:
Fully cached responses are served directly from local storage. Because no network connection needs to be made such responses are available immediately.
Conditionally cached responses must have their freshness validated by the webserver. The client sends a request like “Give me /foo.png if it changed since yesterday” and the server replies with either the updated content or a
304 Not Modifiedstatus. If the content is unchanged it will not be downloaded!Uncached responses are served from the web. These responses will get stored in the response cache for later.
Use reflection to enable HTTP response caching on devices that support it. This sample code will turn on the response cache on Ice Cream Sandwich without affecting earlier releases:
private void enableHttpResponseCache() {
try {
long httpCacheSize = 10 * 1024 * 1024; // 10 MiB
File httpCacheDir = new File(getCacheDir(), "http");
Class.forName("android.net.http.HttpResponseCache")
.getMethod("install", File.class, long.class)
.invoke(null, httpCacheDir, httpCacheSize);
} catch (Exception httpResponseCacheNotAvailable) {
}
}
You should also configure your Web server to set cache headers on its HTTP responses.
Which client is best?
Apache HTTP client has fewer bugs on Eclair and Froyo. It is the best choice for these releases.
For Gingerbread and better, HttpURLConnection is the best choice. Its simple API and small size makes it great fit for Android. Transparent compression and response caching reduce network use, improve speed and save battery. New applications should use HttpURLConnection; it is where we will be spending our energy going forward.
[Android]Volley源码分析(四)的更多相关文章
- Android Volley源码分析
今天来顺手分析一下谷歌的volley http通信框架.首先从github上 下载volley的源码, 然后新建你自己的工程以后 选择import module 然后选择volley. 最后还需要更改 ...
- [Android]Volley源码分析(五)
前面几篇通过源码分析了Volley是怎样进行请求调度及请求是如何被实际执行的,这篇最后来看下请求结果是如何交付给请求者的(一般是Android的UI主线程). 类图:
- [Android]Volley源码分析(三)
上篇看了关于Request的源码,这篇接着来看下RequestQueue的源码. RequestQueue类图:
- [Android]Volley源码分析(二)
上一篇介绍了Volley的使用,主要接触了Request与RequestQueue这两个类,这篇就来了解一下这两个类的具体实现. Request类图:
- Volley源码分析(四)NetWork与ResponseDelivery工作原理
这篇文章主要分析网络请求和结果交付的过程. NetWork工作原理 之前已经说到通过mNetWork.performRequest()方法来得到NetResponse,看一下该方法具体的执行流程,pe ...
- [Android]Volley源码分析(一)
一. 如何使用Volley? 1. 首先定义一个RequestManager类,用来在Android程序启动时对Volley进行初始化.RequestManager为单例类,因为只有在程序启动时调用, ...
- Android Volley源码分析及扩展
转载请标明出处: http://www.cnblogs.com/why168888/p/6681232.html 本文出自:[Edwin博客园] Volley 介绍 Android系统中主要提供了两种 ...
- Volley源码分析(2)----ImageLoader
一:imageLoader 先来看看如何使用imageloader: public void showImg(View view){ ImageView imageView = (ImageView) ...
- Appium Android Bootstrap源码分析之启动运行
通过前面的两篇文章<Appium Android Bootstrap源码分析之控件AndroidElement>和<Appium Android Bootstrap源码分析之命令解析 ...
随机推荐
- Linux 客户端访问 NFS报Permission Denied错误
在Linux服务器上访问NFS共享目录时,报错:Permission denied. 如下截图所示: 因为这个NFS是系统管理员配置的,我又不了解具体情况,而系统管理员休假中,联系不上.那么我只能先多 ...
- SQL Like模糊查询一些小知识
模糊查询: where mc like '值':返回值等同于where mc ='值' where mc like '%值':匹配 名称是 '*值'(以“值”作为结尾)的所有数据,*表示任何值任何长度 ...
- KVM 存储虚拟化 - 每天5分钟玩转 OpenStack(7)
KVM 的存储虚拟化是通过存储池(Storage Pool)和卷(Volume)来管理的. Storage Pool 是宿主机上可以看到的一片存储空间,可以是多种类型,后面会详细讨论.Volume 是 ...
- 【推荐】CentOS安装vsftpd-3.0.2+安全配置
注:以下所有操作均在CentOS 6.5 x86_64位系统下完成. FTP的登录一般有三种方式,分别是: 匿名用户形式:默认安装的情况下,系统只提供匿名用户访问,只需要输入用户anonymous/f ...
- 基础SQL语句/语法
SQL是现在进入互联网工作人们的必须技能之一,下面分享自己觉得很nice的SQL基本语句,从网上找了,觉得很不错,就分享给大家!简要介绍基础语句: 1.说明:创建数据库 Create DATABAS ...
- 实验楼 linux 学习
实验楼 linux 学习 一.Linux 用户管理 1.查看用户 who am i // who mom likes whoami ====--------====== 输入的第一列表示打 ...
- PhotoShop算法原理解析系列 - 像素化---》碎片。
接着上一篇文章的热度,继续讲讲一些稍微简单的算法吧. 本文来讲讲碎片算法,先贴几个效果图吧: 这是个破坏性的滤镜,拿美女来说事是因为搞图像的人90%是男人,色色的男人. 关于碎 ...
- u3d_Shader_effects笔记6 第四章 使用cubeMap简单的反射读取
一:前面心情: 1.今天开了个小会,该看的继续要看,不要堕落. 2.还有就是丽的生活习惯不太好.慢慢改变. 3.哎,公司人员争夺吗?哎,不知道,不了解,不去想,提升自己,内心明净 二.主要内容和参考 ...
- MAVEN构建Spring +Spring mvc + Mybatis 项目(Maven配置部分(workshop))
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/20 ...
- http协议进阶(三)补充:报文首部
之前写的关于报文首部的传送门: 报文首部:http://www.cnblogs.com/imyalost/p/5708445.html 通用首部字段:http://www.cnblogs.com/im ...