Android进阶-Volley-4.Network源码
Volley的核心结构如下所示:
今天主要看Network相关:
Network整体功能介绍:通过实现了Network接口的类(这里是BasicNetwork),执行从ReqeuestQueue中取出的请求Request,将执行完的结果以NetworkResponse的类型返回。
测试代码:
btnTest.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { // TODO Auto-generated method stub new Thread() { @Override public void run() { StringRequestrequest = newStringRequest( "http://www.youku.com",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 block for (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.2 performRequest:
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.3 entityFromConnection:
private static HttpEntity entityFromConnection(HttpURLConnectionconnection){…}
函数功能:根据给定的HttpURLConnection返回一个HttpEntity,HttpEntity是一个接口,这里使用的是BasicHttpEntity,返回的HttpEntity中包含了HttpURLConnection中的信息:内容(Content)、内容长度(ContentLength)、编码方式(Encoding)、内容类型(ContentType)
关联函数:无
执行流程:略
1.4 createConnection:
protected HttpURLConnection createConnection(URL url) throwsIOException { return(HttpURLConnection) url.openConnection(); }
函数功能:根据URL打开HttpURLConnection。
关联函数:无
执行流程:略
1.5 openConnection:
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.6 setConnectionParametersForRequest:
static void setConnectionParametersForRequest(HttpURLConnectionconnection, Request<?> request)throws IOException, AuthFailureError {…}
函数功能:为请求Request设置Connection的连接方式,有Get、Post、Delete等
关联函数:无
执行流程:略
1.7 addBodyIfExists:
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.2 getBuf:
public synchronized byte[] getBuf(int len) {…}
函数功能:获取长度不小于 len 的 byte[],遍历缓存,找出第一个长度大于传入参数len的 byte[],并返回;如果最终没有合适的byte[],new 一个返回。
关联函数:无
执行流程:略
2.3 returnBuf:
函数功能:将用过的 byte[] 回收,根据 byte[] 长度按照从小到大的排序将 byte[] 插入到缓存中合适位置。
关联函数:trim
执行流程:略
2.4 trim:
函数功能:当缓存的 byte 超过预先设置的大小时,按照先进先出的顺序删除最早的 byte[]。
关联函数:无
执行流程:略
3. BasicNetwork.java&Network.java
主要功能:调用HttpStack处理Request,将HttpStack返回的HttpResponse转化为NetworkResponse(在volley中ResponseDelivery传递的是NetworkResponse)。
类图:
函数分析:
3.1 构造函数
public BasicNetwork(HttpStack httpStack) { // If a pool isn'tpassed in, then build a small default pool that will give us a lot of // benefit and not usetoo much memory. this(httpStack, newByteArrayPool(DEFAULT_POOL_SIZE)); } /** * @param httpStack HTTPstack to be used * @param pool a bufferpool that improves GC performance in copy operations */ publicBasicNetwork(HttpStack httpStack, ByteArrayPool pool) { mHttpStack =httpStack; mPool = pool; }
3.2 performRequest:
函数功能:利用实现HttpStack接口的类,如HurlStack,先将Request解析为HttpResponse类型,再将其封装成NetworkResponse类型返回。
关联函数:addCacheHeaders、entityToBytes
执行流程:略
3.3 logSlowRequests:
函数功能:若网络请求时间过长或DEBUG开关打开,则打印log消息
关联函数:无
执行流程:略
3.4 attemptRetryOnException:
函数功能:尝试重新连接,在连接超时、认证失败等情况下会调用本函数。里面有个retryPolicy参数,用于设置重试策略
关联函数:Request中的一些函数
执行流程:获取重试策并重试request.getRetryPolicy().retry(exception),在request中addMarker
3.5 addCacheHead:
函数功能:获取缓存数据
关联函数:无
执行流程:无缓存数据则直接返回,有则将其加入Map<String,String> headers中,这里的header用于存放缓存数据
3.6 logError:
函数功能:打印错误信息
关联函数:无
执行流程:略
3.7 entityToBytes:
函数功能:解析HttpEntity,将其数据转为byte[]类型
关联函数:ByteArrayPool中的一些函数
执行流程:无
3.8 convertHeaders:
函数功能:将Header[]类型转换为Map<String,String>
关联函数:无
执行流程:略
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。