我們平時在開發Android應用的時候不可避免地都需要用到網絡技術,而多數情況下應用程式都會使用HTTP協定來發送和接收網絡資料。Android系統中主要提供了兩種方式來進行HTTP通信,HttpURLConnection和HttpClient,幾乎在任何項目的代碼中我們都能看到這兩個類的身影,使用率非常高。
不過HttpURLConnection和HttpClient的用法還是稍微有些複雜的,如果不進行适當封裝的話,很容易就會寫出不少重複代碼。于是乎,一些Android網絡通信架構也就應運而生,比如說AsyncHttpClient,它把HTTP所有的通信細節全部封裝在了内部,我們隻需要簡單調用幾行代碼就可以完成通信操作了。再比如Universal-Image-Loader,它使得在界面上顯示網絡圖檔的操作變得極度簡單,開發者不用關心如何從網絡上擷取圖檔,也不用關心開啟線程、回收圖檔資源等細節,Universal-Image-Loader已經把一切都做好了。
Android開發團隊也是意識到了有必要将HTTP的通信操作再進行簡單化,于是在2013年Google I/O大會上推出了一個新的網絡通信架構——Volley。Volley可是說是把AsyncHttpClient和Universal-Image-Loader的優點集于了一身,既可以像AsyncHttpClient一樣非常簡單地進行HTTP通信,也可以像Universal-Image-Loader一樣輕松加載網絡上的圖檔。除了簡單易用之外,Volley在性能方面也進行了大幅度的調整,它的設計目标就是非常适合去進行資料量不大,但通信頻繁的網絡操作,而對于大資料量的網絡操作,比如說下載下傳檔案等,Volley的表現就會非常糟糕。
下圖所示的這些應用都是屬于資料量不大,但網絡通信頻繁的,是以非常适合使用Volley。
介紹了這麼多理論的東西,下面我們就準備開始進行實戰了,首先需要将Volley的jar包準備好,如果你的電腦上裝有Git,可以使用如下指令下載下傳Volley的源碼:
下載下傳完成後将它導入到你的Eclipse工程裡,然後再導出一個jar包就可以了。如果你的電腦上沒有Git,那麼也可以直接使用我導出好的jar包,下載下傳位址是:
<a href="http://download.csdn.net/detail/q4878802/9016211">http://download.csdn.net/detail/q4878802/9016211</a>
建立一個Android項目,将volley.jar檔案複制到libs目錄下,這樣準備工作就算是做好了。
前面已經說過,Volley的用法非常簡單,那麼我們就從最基本的HTTP通信開始學習吧,即發起一條HTTP請求,然後接收HTTP響應。首先需要擷取到一個RequestQueue對象,可以調用如下方法擷取到:
注意這裡拿到的RequestQueue是一個請求隊列對象,它可以緩存所有的HTTP請求,然後按照一定的算法并發地發出這些請求。RequestQueue内部的設計就是非常合适高并發的,是以我們不必為每一次HTTP請求都建立一個RequestQueue對象,這是非常浪費資源的,基本上在每一個需要和網絡互動的Activity中建立一個RequestQueue對象就足夠了。
接下來為了要發出一條HTTP請求,我們還需要建立一個StringRequest對象,如下所示:
可以看到,這裡new出了一個StringRequest對象,StringRequest的構造函數需要傳入三個參數,第一個參數就是目标伺服器的URL位址,第二個參數是伺服器響應成功的回調,第三個參數是伺服器響應失敗的回調。其中,目标伺服器位址我們填寫的是百度的首頁,然後在響應成功的回調裡列印出伺服器傳回的内容,在響應失敗的回調裡列印出失敗的詳細資訊。
最後,将這個StringRequest對象添加到RequestQueue裡面就可以了,如下所示:
另外,由于Volley是要通路網絡的,是以不要忘記在你的AndroidManifest.xml中添加如下權限:
好了,就是這麼簡單,如果你現在運作一下程式,并發出這樣一條HTTP請求,就會看到LogCat中會列印出如下圖所示的資料。

沒錯,百度傳回給我們的就是這樣一長串的HTML代碼,雖然我們看起來會有些吃力,但是浏覽器卻可以輕松地對這段HTML代碼進行解析,然後将百度的首頁展現出來。
這樣的話,一個最基本的HTTP發送與響應的功能就完成了。你會發現根本還沒寫幾行代碼就輕易實作了這個功能,主要就是進行了以下三步操作:
建立一個RequestQueue對象。
建立一個StringRequest對象。
将StringRequest對象添加到RequestQueue裡面。
不過大家都知道,HTTP的請求類型通常有兩種,GET和POST,剛才我們使用的明顯是一個GET請求,那麼如果想要發出一條POST請求應該怎麼做呢?StringRequest中還提供了另外一種四個參數的構造函數,其中第一個參數就是指定請求類型的,我們可以使用如下方式進行指定:
可是這隻是指定了HTTP請求方式是POST,那麼我們要送出給伺服器的參數又該怎麼設定呢?很遺憾,StringRequest中并沒有提供設定POST參數的方法,但是當發出POST請求的時候,Volley會嘗試調用StringRequest的父類——Request中的getParams()方法來擷取POST參數,那麼解決方法自然也就有了,我們隻需要在StringRequest的匿名類中重寫getParams()方法,在這裡設定POST參數就可以了,代碼如下所示:
你可能會說,每次都這樣用起來豈不是很累?連個設定POST參數的方法都沒有。但是不要忘記,Volley是開源的,隻要你願意,你可以自由地在裡面添加和修改任何的方法,輕松就能定制出一個屬于你自己的Volley版本。
學完了最基本的StringRequest的用法,我們再來進階學習一下JsonRequest的用法。類似于StringRequest,JsonRequest也是繼承自Request類的,不過由于JsonRequest是一個抽象類,是以我們無法直接建立它的執行個體,那麼隻能從它的子類入手了。JsonRequest有兩個直接的子類,JsonObjectRequest和JsonArrayRequest,從名字上你應該能就看出它們的差別了吧?一個是用于請求一段JSON資料的,一個是用于請求一段JSON數組的。
至于它們的用法也基本上沒有什麼特殊之處,先new出一個JsonObjectRequest對象,如下所示:
最後再将這個JsonObjectRequest對象添加到RequestQueue裡就可以了,如下所示:
這樣當HTTP通信完成之後,伺服器響應的天氣資訊就會回調到onResponse()方法中,并列印出來。現在運作一下程式,發出這樣一條HTTP請求,就會看到LogCat中會列印出如下圖所示的資料。
由此可以看出,伺服器傳回給我們的資料确實是JSON格式的,并且onResponse()方法中攜帶的參數也正是一個JSONObject對象,之後隻需要從JSONObject對象取出我們想要得到的那部分資料就可以了。
你應該發現了吧,JsonObjectRequest的用法和StringRequest的用法基本上是完全一樣的,Volley的易用之處也在這裡展現出來了,會了一種就可以讓你舉一反三,是以關于JsonArrayRequest的用法相信已經不需要我再去講解了吧。