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 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, Requestrequest) 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 headers中,這裡的header用於存放快取資料
3.6 logError:
函數功能:列印錯誤資訊
關聯函數:無
執行流程:略
3.7 entityToBytes:
函數功能:解析HttpEntity,將其資料轉為byte[]類型
關聯函數:ByteArrayPool中的一些函數
執行流程:無
3.8 convertHeaders:
函數功能:將Header[]類型轉換為Map
關聯函數:無
執行流程:略