Android進階-Volley-4.Network源碼

來源:互聯網
上載者:User

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

關聯函數:無

執行流程:略

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.