編輯:關於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,MapadditionalHeaders) 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
3.6 logError:
函數功能:打印錯誤信息
關聯函數:無
執行流程:略
3.7 entityToBytes:
函數功能:解析HttpEntity,將其數據轉為byte[]類型
關聯函數:ByteArrayPool中的一些函數
執行流程:無
3.8 convertHeaders:
函數功能:將Header[]類型轉換為Map
關聯函數:無
執行流程:略
由於努比亞 Z5S(NX503A)對底包的要求較高,安卓4.2的升級到4.4的需要升級4.4的底包再進行刷機,反之亦然刷機精靈降級教程步驟如下 1、首先下
記得一年前安卓開始火爆的時候,網上就有各種各樣的Windows下安裝安卓環境。很復雜,當時筆者在想,如果有人能開發Windows下一鍵安裝安卓模擬器那就火了
前些天有個大神告訴我,你寫這麼多TetxtView實際上就實現了一個TextView的功能。我說我要設置background,textsize,textcolor阿,還有
頂部指示器?這是什麼?好吧,我承認這是我自己想出來的詞,因為我不知道它有什麼學名,究竟是什麼呢?看下這個圖就知道了。這是我們的美工MM畫的,偶的神吶,這雖然很漂亮