淺談Volley網絡框架(一)

寫這篇文章的時候,我也看過很多博客以及介紹這個框架的視頻了!所以這裏我就直接挑乾貨分享給大家!

網絡框架是什麼玩意?

在開發中,訪問網絡可能是家常便飯的事。想必大家肯定知道HttpURLConnection和HttpClient這兩個東西,你應該是最先認識他倆的,他倆一聯手訪問網絡的問題就解決了,但是缺點也不斷不暴漏了出來。就是新手使用的時候,不會加以封裝或者封裝不好,這樣的話會造成複用性差,程序代碼冗餘。於是後期出現了網絡框架,這個網絡框架就是所謂的“大神”幫你封裝好的,你直接用就行了,並且你擔心的問題也會幫你解決,比如你在使用Universal-Image-Loader的時候就不需要考慮開啓線程、回收圖片資源等問題了。AsyncHttpClient這個框架的話使用起來也是非常簡便,還有XUtils等等。可以說網絡框架的出現在開發中使用起來非常的簡便,實用!

Volley是誰?有啥用啊?

Google一看,這不行啊。這網絡框架越來越多,自己卻沒有一個拿得出手的,於是Google在2013年I/O大會上發佈了自己的網絡框架–Volley
這個Volley可以說汲取了Universal-Image-Loader和AsyncHttpClient的等其他網絡框架的優點,你使用的時候即不用擔心操作繁瑣,也不用擔心線程問題和回收圖片的種種問題

Volley的優點:

  1. 通訊更快,更簡單。網絡模塊的穩定性強。這張圖是I/O大會上的一張配圖,也證實了Volley適合簡單的高併發請求,但下載和上傳這方面Volley的體現就比較水了

    Look!像美團這種的樣式就比較適合Volley
    這裏寫圖片描述

  2. 圖像的異步加載
  3. 緩存
  4. 網絡請求的優先級處理
  5. 多級別取消請求

上面的都是瞭解一下就行,和別人嘮嗑或面試的時候別不知道Volley的特點,別不知道Volley是哪個公司推出的就行。重點還是接下來,那麼下面開始給大家分享乾貨

Volley的使用

1.你需要先下載一個Jar包,導入到項目中
http://download.csdn.net/detail/sinyu890807/7152015

2.是請求網絡,就要添加網絡權限!我推薦你創建應用就添加上,這是一個習慣,我一開始總是想寫完了在添加,結果就忘了…雖然也不是什麼大事

<uses-permission android:name="android.permission.INTERNET" />

3.接下來就可以使用了,不過我個人習慣使用之前先把這個類的結構弄明白了,學底層用頂層,學父類用子類。所以這裏我帶着大家把接下來要用到的類以及體系結構介紹一下
下面要使用StringRequest類,這個類繼承了Request抽象類,通過源碼可以看一下StringRequest的構造函數

 public StringRequest(int method, String url, Listener<String> listener,ErrorListener errorListener) {
        super(method, url, errorListener);
        mListener = listener;
    }

上面這個是四個參數的構造函數,可以指明請求方式,他的重載是下面這個

public StringRequest(String url, Listener<String> listener, ErrorListener errorListener) {
        this(Method.GET, url, listener, errorListener);
    }

可以看出來這個只有三個參數,如果你使用三個參數的構造函數來創建對象的話,那麼默認就是GET方式了。

這裏我先用三個參數的構造函數演示一把請求,你也可以用四個參數的構造函數創造對象,區別就在於第一個參數(指定請求方式)

參數一url:代表你請求的服務器地址,沒什麼可說的
後兩個參數點擊進去我們在看源碼

public class Response<T> {

    /** Callback interface for delivering parsed responses. */
    public interface Listener<T> {
        /** Called when a response is received. */
        public void onResponse(T response);
    }

    /** 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);
    }
    //....
}

得知Listener和ErrorListener都是Response類定義的兩個接口,也就是一會要傳遞的參數就需要實現Listener接口和實現ErrorListener這兩個接口的實現類,好,那三個參數都知道了,下面使用就非常的簡單了

//創建請求管理隊列
        RequestQueue queues = Volley.newRequestQueue(MainActivity.this);
        //GET請求
        StringRequest request = new StringRequest("http://www.baidu.com", new Response.Listener<String>() {
            @Override
            public void onResponse(String response) {
                Toast.makeText(MainActivity.this, response, Toast.LENGTH_SHORT).show();
            }
        }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                Toast.makeText(MainActivity.this, error.getMessage(), Toast.LENGTH_SHORT).show();               
            }
        });
        request.setTag("baiduRequest");//起個名字,方便管理
        queues.add(request);//添加到請求隊列

那麼一個簡單的用StringRequest對象進行的GET請求就完事了,下面演示Post請求,可惜的是,從剛纔的構造函數得知,兩個構造函數的參數都沒有Post請求的形參,但是他的父類Request中,有getParams()方法,子類只需要重寫這個方法,返回一個Map集合。並在請求的時候指明是Method.Post請求,系統就會自動去找這個方法的實現當做Post請求的參數。看一下下面的例子,我想你就明白怎麼用了!

//這裏的Post請求用的是聚合數據的接口
    RequestQueue queues = Volley.newRequestQueue(MainActivity.this);
        StringRequest request = new StringRequest(Request.Method.POST, "http://op.juhe.cn/onebox/news/query", new Response.Listener<String>() {
            @Override
            public void onResponse(String s) {
                Toast.makeText(MainActivity.this,s,Toast.LENGTH_SHORT).show();
            }
        }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError volleyError) {
                Toast.makeText(MainActivity.this,volleyError.getMessage(),Toast.LENGTH_SHORT).show();
            }
        })
        {

            /*重寫父類的函數,返回的Map用於給Post請求當做參數*/
            @Override
            protected Map<String, String> getParams() throws AuthFailureError
            {
                Map<String,String> map = new HashMap();
                map.put("key","&q=%E6%99%AE%E4%BA%AC%E5%A4%B1%E8%B8%AA");
                return map;
            }
        };
        //這裏不給request請求加名字也是可以的,後期與Activity聯動的時候會說到
        queues.add(request);

看到這了,你應該瞭解下面的知識點
1.StringRequest繼承Request
2.StringRequest的構造函數以及Request中的核心方法
3.創建一個請求的步驟(重要)

  1. 先拿到RequestQueue

  2. 然後創建StringRequest請求,如果是get,指明URL地址並實現Response中的Listener和ErrorListener接口,如果是Post,要指定是Method.POST請求和URL,實現兩個接口,並且要重寫getParams()

  3. 給請求起個名字setTag(“”)
  4. 將本次請求加入請求隊列

如果你看懂了上面的內容,你對Volley的請求基本上就瞭解了,今天只說了StringRequest請求,下次我還會寫JsonRequest下兩個直接子類的請求。如果你看了之後,感覺邏輯還是很亂,建議去看看源碼或者自己敲一遍

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章