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

相关推荐