Volley 核心源码解析(一)
Http请求的基本过程
volley的初始化RequestQueuerequestQueue=Volley.newRequestQueue(context),
返回的是一个RequestQueue对象,这个对象的作用下面再说。现在进入到方法的内部可以看到
这么几个重载的方法:
publicstaticRequestQueuenewRequestQueue(Contextcontext){
returnnewRequestQueue(context,null);
}
publicstaticRequestQueuenewRequestQueue(Contextcontext,HttpStackstack)
{
returnnewRequestQueue(context,stack,-1);
}
publicstaticRequestQueuenewRequestQueue(Contextcontext,HttpStackstack,intmaxDiskCacheBytes){
FilecacheDir=newFile(context.getCacheDir(),DEFAULT_CACHE_DIR);
StringuserAgent="volley/0";
try{
StringpackageName=context.getPackageName();
PackageInfoinfo=context.getPackageManager().getPackageInfo(packageName,0);
userAgent=packageName+"/"+info.versionCode;
}catch(NameNotFoundExceptione){
}
if(stack==null){
if(Build.VERSION.SDK_INT>=9){
stack=newHurlStack();
}else{
//PriortoGingerbread,HttpUrlConnectionwasunreliable.
//See:http://android-developers.blogspot.com/2011/09/androids-http-clients.html
stack=newHttpClientStack(AndroidHttpClient.newInstance(userAgent));
}
}
Networknetwork=newBasicNetwork(stack);
此时我们看看HttpClientStack类,那么这个类是做什么的呢?
publicclassHttpClientStackimplementsHttpStack
HttpStack是一个接口仅仅只有一个方法:
publicHttpResponseperformRequest(Request<?>request,Map<String,String>additionalHeaders)
throwsIOException,AuthFailureError;
[align=left][/align]
参数是一个Request<?>的对象这是一个泛型,它的作用下面再说。
那么这个方法译为中文就是:执行请求。
在HttpClientStack中performRequest的具体实现如下:
@Override
publicHttpResponseperformRequest(Request<?>request,Map<String,String>additionalHeaders)
throwsIOException,AuthFailureError{
HttpUriRequesthttpRequest=createHttpRequest(request,additionalHeaders);
addHeaders(httpRequest,additionalHeaders);
addHeaders(httpRequest,request.getHeaders());
onPrepareRequest(httpRequest);
HttpParamshttpParams=httpRequest.getParams();
inttimeoutMs=request.getTimeoutMs();
//TODO:Reevaluatethisconnectiontimeoutbasedonmorewide-scale
//datacollectionandpossiblydifferentforwifivs.3G.
HttpConnectionParams.setConnectionTimeout(httpParams,5000);
HttpConnectionParams.setSoTimeout(httpParams,timeoutMs);
returnmClient.execute(httpRequest);
}
protectedfinalHttpClientmClient;
直到这时候,才发现Volley默认使用的是apacheHttpClient框架,记得很早以前看到一篇文章说Android开发团队推荐使用java.net包中的HttpUrlConnection作为网络请求的方式,针对android平台做过优化,却不知为何在Volley中还是默认使用HttpClient?
再来看看Network接口;
publicNetworkResponseperformRequest(Request<?>request)throwsVolleyError;
仍然只有一个执行请求的方法。
在实现类BasicNetwork的构造方法中,HttpStack被作为了参数。
@Override
publicNetworkResponseperformRequest(Request<?>request)throwsVolleyError{
longrequestStart=SystemClock.elapsedRealtime();
while(true){
HttpResponsehttpResponse=null;
byte[]responseContents=null;
Map<String,String>responseHeaders=Collections.emptyMap();
try{
//Gatherheaders.
Map<String,String>headers=newHashMap<String,String>();
addCacheHeaders(headers,request.getCacheEntry());
httpResponse=mHttpStack.performRequest(request,headers);
StatusLinestatusLine=httpResponse.getStatusLine();
intstatusCode=statusLine.getStatusCode();
.....
}
看到这里我们似乎明白了volley对http请求的调用顺序是:
Network---->HttpStack---->HttpClient
如果读者细心会发现,现有的网络执行过程中,不支持上传文件等属性,
在Volley初始化请求队列的时候,有一个重载方法:
publicstaticRequestQueuenewRequestQueue(Contextcontext,HttpStackstack)
{
returnnewRequestQueue(context,stack,-1);
}
那么要实现更复杂的网络请求,只需要实现自己的HttpStack在
performRequest()方法中灵活实现即可满足需求。
Volley的Request对象
阅读源代码我们发现
publicabstractclassRequest<T>implementsComparable<Request<T>>
Request是一个泛型的抽象类,且是可比较的。
那么为什么要实现Comparable接口呢?
我的理解是要避免重复请求。
publicinterfaceMethod{
intDEPRECATED_GET_OR_POST=-1;
intGET=0;
intPOST=1;
intPUT=2;
intDELETE=3;
intHEAD=4;
intOPTIONS=5;
intTRACE=6;
intPATCH=7;
}
在Request中有Method接口定义了支持的Http请求方法。
abstractprotectedResponse<T>parseNetworkResponse(NetworkResponseresponse);
这是一个抽象方法,那么要实现自定义的请求就必须实现这个方法。如GsonRequest,ImageRequest等等。
发送Post请求必须重写getPostParams()方法:
@Deprecated
protectedMap<String,String>getPostParams()throwsAuthFailureError{
returngetParams();
}
至此,对Volley的网络请求的过程以及源码的分析告一段落。
下一节请求队列RequestQueuehttp://f303153041.iteye.com/blog/2281350