4.Network源码

Volley的核心结构如下所示:

今天主要看Network相关:

Network整体功能介绍:通过实现了Network接口的类(这里是BasicNetwork),执行从ReqeuestQueue中取出的请求Request,将执行完的结果以NetworkResponse的类型返回。

测试代码:

btnTest.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View arg0) {// TODO Auto-generated method stubnew Thread() {@Overridepublic void run() {StringRequestrequest = newStringRequest("",null,null);NetworkResponser = newNetworkResponse(null);BasicNetworknetwork = newBasicNetwork(newHurlStack());try {r= network.performRequest(request);Stringstr = newString(r.data);Log.i("msg", str);}catch(Exception e) {// TODO Auto-generated catch blockfor (int i = 0; i < 100; ++i)Log.e("ERROR","ERROR");}}}.start();}});

1.HurlStack.java&HttpStack.java

主要功能:HurlStack实现了HttpStack接口中的performRequest,主要利用HttpUrlConnection执行传入的Request,并返回HttpResponse。

类图:

函数分析:

1.1构造函数:

public HurlStack() {this(null); }/*** @param urlRewriter Rewriter to use for request URLs*/ public HurlStack(UrlRewriter urlRewriter) {this(urlRewriter, null); }/*** @param urlRewriter Rewriter touse for request URLs* @param sslSocketFactory SSL factory to use for HTTPS connections*/ public HurlStack(UrlRewriter urlRewriter, SSLSocketFactorysslSocketFactory) {mUrlRewriter = urlRewriter;mSslSocketFactory = sslSocketFactory; }

用于为成员变量赋值。

1.2performRequest:

public HttpResponse performRequest(Request<?> request,Map<String, String> additionalHeaders)throws IOException,AuthFailureError {…}

函数功能:解析参数Request,返回HttpResponse。

关联函数:openConnection、setConnectionParametersForRequest,entityFromConnection

执行流程:获得Request中的url,执行函数openConnection获得HttpURLConnection,通过setConnectionParametersForRequest解析Request,设置HttpURLConnection的参数。将获取的内容通过entityFromConnection封装为HttpEntity,存入要返回的Response(这里的Response类型为BasicHttpResponse)中,最后返回Response。

1.3entityFromConnection:

private static HttpEntity entityFromConnection(HttpURLConnectionconnection){…}

函数功能:根据给定的HttpURLConnection返回一个HttpEntity,HttpEntity是一个接口,这里使用的是BasicHttpEntity,返回的HttpEntity中包含了HttpURLConnection中的信息:内容(Content)、内容长度(ContentLength)、编码方式(Encoding)、内容类型(ContentType)

关联函数:无

执行流程:略

1.4createConnection:

protected HttpURLConnection createConnection(URL url) throwsIOException {return(HttpURLConnection) url.openConnection();}

函数功能:根据URL打开HttpURLConnection。

关联函数:无

执行流程:略

1.5openConnection:

private HttpURLConnection openConnection(URL url, Request<?>request) throws IOException{…}

函数功能:打开一个带参数的HttpURLConnection

关联函数:createConnection

执行流程:调用createConnection打开指定URL的HttpURLConnection,之后根据Request中的参数, 设置connection的连接超时大小,设置不使用用户缓存(connection.setUseCaches(false);),设置从connection读入(connection.setDoInput(true);)。若使用的是https协议,还要设置当此实例连接创建套接字时使用的SSLSocketFactory。

1.6setConnectionParametersForRequest:

static void setConnectionParametersForRequest(HttpURLConnectionconnection,Request<?> request)throws IOException, AuthFailureError {…}

函数功能:为请求Request设置Connection的连接方式,有Get、Post、Delete等

关联函数:无

执行流程:略

1.7addBodyIfExists:

private static void addBodyIfExists(HttpURLConnection connection,Request<?> request) throws IOException, AuthFailureError {…}

函数功能:?

关联函数:?

执行流程:?

2.ByteArrayPool.java

主要功能:ByteArrayPool是byte数组的回收池,用于byte数组的回收再利用,减少了内存的分配和回收。主要通过一个元素长度从小到大排序的ArrayList作为 byte[] 的缓存,另有一个按使用时间先后排序的ArrayList属性用于缓存满时清理元素。

类图:

函数分析:

2.1构造函数

public ByteArrayPool(int sizeLimit) {mSizeLimit = sizeLimit; }

设置Pool中缓存byte大小的最大值

2.2getBuf:

public synchronized byte[] getBuf(int len) {…}

函数功能:获取长度不小于 len 的 byte[],,遍历缓存,找出第一个长度大于传入参数len的 byte[],并返回;如果最终没有合适的byte[],new 一个返回。

关联函数:无

执行流程:略

2.3returnBuf:

函数功能:将用过的 byte[] 回收,根据 byte[] 长度按照从小到大的排序将 byte[] 插入到缓存中合适位置。

关联函数:trim

执行流程:略

2.4trim:

函数功能:当缓存的 byte 超过预先设置的大小时,按照先进先出的顺序删除最早的 byte[]。

关联函数:无

执行流程:略

3.BasicNetwork.java&Network.java

主要功能:调用HttpStack处理Request,将HttpStack返回的HttpResponse转化为NetworkResponse(在volley中ResponseDelivery传递的是NetworkResponse)。

类图:

灯红酒绿的城市,登上楼顶,俯视万家灯火,

4.Network源码

相关文章:

你感兴趣的文章:

标签云: