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>

关联函数:无

执行流程:略


郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。