谷歌Volley網絡框架講解——第一篇


自從公司新招了幾個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();

好了今天就到這,下班回家。。。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM