Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android進階-Volley-4.Network源碼

Android進階-Volley-4.Network源碼

編輯:關於Android編程

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

關聯函數:無

執行流程:略

 

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved