編輯:關於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) 升級/降級底包教程
由於努比亞 Z5S(NX503A)對底包的要求較高,安卓4.2的升級到4.4的需要升級4.4的底包再進行刷機,反之亦然刷機精靈降級教程步驟如下 1、首先下
Windows下一鍵安裝安卓模擬器
記得一年前安卓開始火爆的時候,網上就有各種各樣的Windows下安裝安卓環境。很復雜,當時筆者在想,如果有人能開發Windows下一鍵安裝安卓模擬器那就火了
SpannableUtil,Android復合文本的使用
前些天有個大神告訴我,你寫這麼多TetxtView實際上就實現了一個TextView的功能。我說我要設置background,textsize,textcolor阿,還有
ListView實現頂部和底部內容指示器的方法
頂部指示器?這是什麼?好吧,我承認這是我自己想出來的詞,因為我不知道它有什麼學名,究竟是什麼呢?看下這個圖就知道了。這是我們的美工MM畫的,偶的神吶,這雖然很漂亮