自從公司新招了幾個android工程師后,我清閑了些許。於是就可以有時間寫寫博客,研究一些沒來的研究的東西。
今年的谷歌IO大會上,谷歌推出了自己的網絡框架——Volley。不久前就聽說了但是沒有clone下來,這次終於把源碼弄下來了。
這個框架對網絡請求數據緩存做了很多優化,其他說明就請自行百度吧。。。
在這梳理一下網絡請求的過程:
先看一段網絡請求的代碼吧
mQueue = Volley.newRequestQueue(getApplicationContext()); //StringRequest四個構造參數分別是Request類型,url,網絡請求響應監聽器,錯誤監聽器 mQueue.add(new StringRequest(Method.GET, "http://www.baidu.com/", new Listener<String>(){ @Override public void onResponse(String arg0) { // TODO Auto-generated method stub Log.e("onResponse", arg0); } }, new ErrorListener(){ @Override public void onErrorResponse(VolleyError arg0) { // TODO Auto-generated method stub Log.e("onErrorResponse", arg0.toString()); } })); mQueue.start();
Volley
首先,通過Volley的靜態方法new一個請求隊列,再調用請求隊列(RequestQueue是由緩存和網絡線程構造的)的start方法。
然后,得到一個RequestQueue請求隊列時,就添加一個請求Request,Volley提供有三種請求的封裝,一個是StringRequest,一個事ImageRequest,還有一個是JsonRequest。
最后,調用RequestQueue的start方法就可以開始一條網絡請求了。
可以看出Volley只是RequestQueue的一個helper。
RequestQueue
所以,這里一個最核心的就是RequestQueue請求隊列這個了。
這個請求隊列是有兩個東西完成,一個是cache一個network。
這個RequestQueue的構造形式有四種:除了上面這兩個還有線程池數量,響應委派。
1,public RequestQueue(Cache cache, Network network, int threadPoolSize,ResponseDelivery delivery)
2, public RequestQueue(Cache cache, Network network, int threadPoolSize)
3,public RequestQueue(Cache cache, Network network)
其實Cache和Network真正的工作者還是CacheDispatcher緩存調度和NetworkDispatcher網絡調度。下期再詳細講解Dispatcher。。
RequestQueue的成員方法主要有下面幾個:
public void start();//請求隊列開始進行調度發vgm
public void stop();//隊列退出調度
public Request add(Request request);//添加一個請求,通過調用start()來執行
void finish(Request request);//這個方法應該是釋放請求資源的方法
public void cancelAll();//取消當前的請求
NetworkDispatcher
這個就是網絡調度的核心,這是一個繼承Thread的類,構造方法如下
public NetworkDispatcher(BlockingQueue<Request> queue,Network network, Cache cache,ResponseDelivery delivery)
一個Request的隊列,Network ,Cache ,ResponseDelivery 。。。
它的run()方法就是把請求隊列取出一個Request,讓Network 去執行一次請求再通過ResponseDelivery 進行解析。
Network
/** * An interface for performing requests. * 這是執行一個請求的接口 */ public interface Network { /** * Performs the specified request. * @param request Request to process * @return A {@link NetworkResponse} with data and caching metadata; will never be null * @throws VolleyError on errors */ public NetworkResponse performRequest(Request<?> request) throws VolleyError; }
這是一個接口,執行請求獲取響應,一個是NetworkResponse 一個是Request。
Request
它的構造方法:
public Request(int method, String url, Response.ErrorListener listener)
第一個method就是請求類型,包括get,put,post,delete;第二個就是請求的url咯,第三個是ErrorListener。
subclass有StringRequest,ImageRequest,JsonObjectRequest,JsonArrayRequest。
1.StringRequest是繼承Request<String> ,對應String的ResponseListener交付請求結果。
public StringRequest(int method, String url, Listener<String> listener,ErrorListener errorListener)
2.JsonRequest有JsonObjectRequest和JsonArrayRequest兩個子類,通過parseNetworkResponse(NetworkResponse response)來處理JsonObject和JsonArray兩個不同結果。
3.ImageRequest的構造參數比較多,主要針對圖片的一些處理工作。多了一個限制圖片最大長寬和configOptions圖片類的東西。
public ImageRequest(String url, Response.Listener<Bitmap> listener, int maxWidth, int maxHeight,Config decodeConfig, Response.ErrorListener errorListener)
Response
Request有個 把NetworkResponse 解析成 Response<T> 的抽象方法。
abstract protected Response<T> parseNetworkResponse(NetworkResponse response);
然后調用Response.Listener<T>的接口返回String,Json或bitmap。最后得到了想要的東西就可以隨便怎么處理了。
Response有兩個接口,一個是Listener回調期望內容的接口和一個ErrorListener接口。
/** Callback interface for delivering parsed responses. */ public interface Listener<T> { /** Called when a response is received. */ public void onResponse(T response); }
onResponse()把想要的json或者string,bitmap數據傳回來
/** Callback interface for delivering error responses. */ public interface ErrorListener { /** * Callback method that an error has been occurred with the * provided error code and optional user-readable message. */ public void onErrorResponse(VolleyError error); }
onErrorResponse會返回一個VolleyError 的錯誤,可以根據這些error進行響應的處理。
VolleyError
這個類繼承Exception,用來捕獲各宗異常。
在NetworkDispatcher里有個處理異常的方法parseAndDeliverNetworkErrorRequest<?> request, VolleyError error();
在請求的過程中把各種異常拋出,然后通過Response的ErrorListener捕獲異常進行處理。
整個過程差不多就是這樣,梳理一番就很清楚,不過谷歌的代碼就是很神,比其他網絡上哪些炒來炒去的框架質量好不少,層次分明結構清晰,看着都賞心悅目。
我們再回過頭來看一下這個請求方法的使用,就很清楚了。
mQueue = Volley.newRequestQueue(getApplicationContext()); //StringRequest四個構造參數分別是Request類型,url,網絡請求響應監聽器,錯誤監聽器 mQueue.add(new StringRequest(Method.GET, "http://www.baidu.com/", new Listener<String>(){ @Override public void onResponse(String arg0) { // TODO Auto-generated method stub Log.e("onResponse", arg0); } }, new ErrorListener(){ @Override public void onErrorResponse(VolleyError arg0) { // TODO Auto-generated method stub Log.e("onErrorResponse", arg0.toString()); } })); mQueue.start();
好了今天就到這,下班回家。。。