## (一).前言:
對于網絡框架這部分,其實也一直想寫點東西總結一下,很長的一段時間對于網絡請求這塊,在我剛開始做Android開發的時候還是2.2,2.3版本居多,那時候我們的項目中經常使用的是HttpURLConnection和HTTPClient來進行HTTP通信。不過這兩種方式的用法有很多復雜的地方,我們在實際使用中都要進行封裝,一個HTTP請求自定義封裝工具類,方法一多一般就是幾百行或者幾千行代碼,這樣如果封裝不好就會出現很多重復的代碼甚至Bug。慢慢的就出現了很多網絡請求框架例如:AsyncHttpClient,OkHttp,google親兒子Okhttp之類的。現在比較熱門的網絡請求框架:Volley,Okhttp,這些已經在項目中得到很多的應用。??
從我這邊的角度來講,我這邊項目網絡請求這塊的演變如下:HttpURLConnection,HTTPClient->Volley->Okhttp。所以我這邊會把Volley和Okhttp這兩個框架的使用,進階,分裝都會講一遍,也方便初學者或者各位能夠學會使用以及明白相關的原理。
Volley系列教程大綱如下:
1. Volley完全解析之基礎
2. Volley完全解析之進階
3. Volley完全解析之源碼分析???????
今天我們首先來進入Volley使用基礎階段,會涉及到字符串,JSON,圖片等等網絡數據請求相關方法的使用。
FastDev4Android框架項目地址:[https://github.com/jiangqqlmj/FastDev4Android](https://github.com/jiangqqlmj/FastDev4Android)
## (二).Volley基本介紹:
2.1.Volley簡介:
2013年Google? I/O大會的時候GoogleAndroid開發團隊推出了一個新網絡數據請求框架Volley網絡通信庫,它能夠使得通信速度更加快,更加簡單以及更健壯。看一下官網的發布圖片:

發射火弓箭的圖有點類似流星,從這幅圖我們可以看出來Volley比較適合數據量不大但是通信頻繁的場景。它當初的設計目標就是非常適合去進行數據量不大,但是網絡通信比較頻繁的操作。但是如果數據量很大的網絡例如:文件下載這類的,Volley框架的效率就會比較差了。
2.2.Volley功能特點:
1. 提供字符串,文本,JSON圖片等數據的異步下載,同時提供回調接口
2. Request請求的優先級以及排序
3. 網絡請求,圖片等相關緩存功能
4. 網絡請求cancel機制
5. 和原生組件生命周期聯動機制(例如:Activity結束的時候,會取消掉網絡請求)等
2.3.Volley框架依賴配置:
Volley庫地址為:https://android.googlesource.com/platform/frameworks/volley你可以使用git進行克隆一份,當然這個地址是被墻掉得。你也可以去github中進行clone下載;
?[https://github.com/mcxiaoke/android-volley](https://github.com/mcxiaoke/android-volley)
然后采用library依賴的方式導入項目,或者編譯成jar包,在進行引入。當然如果你使用的是AndroidStudioIDE,你可以直接添加以下依賴即可:
~~~
compile'com.mcxiaoke.volley:library:1.0.19'
~~~
?????????在我們今天演示的例子項目中,我這邊直接采用庫依賴的方式,如果大家如果clone我這邊FastDev4Android項目,可以直接看到源代碼,便于后面我們對于源代碼的修改以及功能封裝。
## (三).Volley使用講解:
OK有了上面的準備工作,我們現在開始正式使用Volley框架進行我們的網絡請求,要實現網絡數據請求主要要記住下面三步驟:
1.創建RequestQueue對象
2.創建XXRequest對象(XX代表String,JSON,Image等等)
3.把XXRequest對象添加到RequestQueue中即可
3.1.StringRequest使用???
我們現在開始使用StringRequest來獲取文本字符串數據,首先創建RequestQueue對象:
~~~
RequestQueue requestQueue=Volley.newRequestQueue(this);
~~~
該通過Volley的靜態方法newRequestQueue(Context)來獲取一個請求隊列對象,內部設計有請求緩存,系統版本區分請求,并且設計適合于高并發。間接著創建StringRequest對象來發起HTTP請求,然后接收相應數據:
~~~
StringRequest stringRequest=new StringRequest(Request.Method.GET, "http://www.sina.com.cn", new Response.Listener<String>() {
@Override
public void onResponse(String response) {
tv_result.setVisibility(View.VISIBLE);
img_result.setVisibility(View.GONE);
tv_result.setText(response.toString());
}
}, new Response.ErrorListener(){
@Override
public void onErrorResponse(VolleyError error) {
}
});
~~~
創建StringRequest對象傳入四個參數:
1. 請求方法GET/POST/或者其他
2. 請求服務器的目標地址
3. 服務器數據成功響應回調
4. 服務器數據失敗響應回調
第三步,就是StringRequest請求對象加入請求隊列中(RequestQueue)
~~~
requestQueue.add(jsonObjectRequest);
~~~
以上就完成了StringRequest的請求操作,運行效果如下圖:

上面我們就是完成了StringRequest的請求一種實例,不過上面只是簡單的Get請求,Volley框架也還是支持Post請求,但是比較遺憾的是Volley框架沒有直接提供設置Post請求參數的方法,但是我們實現getParams()方法來添加參數,更加讓我們開發使用起來簡單的方法就是修改Volley框架源代碼,后面使用進階中我們會將到源代碼相關修改。現在我們繼續往下看。
3.2.JsonObjectRequest和JsonArrayRequest使用???
JsonObjectRequest和JsonArrayRequest都是集成自JsonRequest,而JsonRequest又是Request的子類。所以我們使用起來還是和StringRequest的方式差不多。
~~~
JsonObjectRequest jsonObjectRequest=new JsonObjectRequest(Request.Method.GET
, "http://interface.zttmall.com/update/mallUpdate",null,new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
Gson gson=new Gson();
tv_result.setVisibility(View.VISIBLE);
img_result.setVisibility(View.GONE);
tv_result.setText(gson.fromJson(response.toString(),UpdateBean.class).toString());
}
}, new Response.ErrorListener(){
@Override
public void onErrorResponse(VolleyError error) {
}
});
requestQueue.add(jsonObjectRequest);
~~~
這邊例子是請求一個地址,返回的是JSON數據格式的數據,我們這邊使用還定義了一個UpdateBean實體類,使用Gson來對數據進行解析,最后把對象打印出來。效果如下:

查看以上的onResponse(JSONObject object)回調方法,傳入參數為JSONObject對象,因為我們的接口返回就是單條的JSON數據,內部已經把JSON數據格式化成JSONObject對象了。得到對象我們直接解析即可。至于JsonArrayRequest的使用和JsonRequest使用差不多,一個單條,一個是多條而已。這邊就不演示了。
3.3.ImageRequest使用
學完上面的文本,josn等數據的加載,現在我們來看一下圖片的加載模塊了,Volley對于圖片加載也給我們提供相應的工具類以及相關方法,主要是以下三種:
1. ImageRequest
2. ImageLoder
3. NetWorkImageView
下面我們來分別學習一下這三種圖片加載方法,首先講一下ImageRequest
ImageRequest也是繼承自Request類,用法步驟和上面的三步驟戰略差不多,整體代碼如下:
~~~
ImageRequest imageRequest=new ImageRequest("http://interface.zttmall.com/Images/upload/image/20150325/20150325083110_0898.jpg"
, newResponse.Listener<Bitmap>() {
@Override
public void onResponse(Bitmap response) {
tv_result.setVisibility(View.GONE);
img_result.setVisibility(View.VISIBLE);
img_result.setImageBitmap(response);
}
}, 300, 300,ImageView.ScaleType.FIT_XY, Bitmap.Config.ARGB_8888, newResponse.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
}
});
requestQueue.add(imageRequest);
~~~
創建ImageRequest對象,然后加入到請求隊列中即可,ImageRequest創建的時候需要傳入一下參數:
* 圖片地址
* 圖片請求成功回調
* 圖片設置寬
* 圖片設置高
* 圖片拉伸類型
* 圖片屬性
* 圖片請求失敗回調
最后ImageRequest對象添加到請求隊列中即可。然后加載顯示圖片如下:

3.4.ImageLoader使用
現在我們來看圖片加載第二種方式使用ImageLoader,該類的使用方法就需要改變一下,因為ImageLoader可以把圖片緩存結合進去,例如我們集合LruCache工具。所以整體來講還是比ImageRequest功能強大了一點。使用步驟如下:
1. 創建RequestQueue請求隊列對象
2. 創建ImageLoader圖片加載器對象
3. 獲取ImageListener圖片監聽器
4. 帶哦用ImageLoader.get()方法來進行加載圖片
下面我們來具體演示一下使用ImageLoder來加載圖片。
首先創建RequestQueue對象:
~~~
RequestQueue requestQueue=Volley.newRequestQueue(this);
~~~
創建ImageLoader對象,需要創建圖片緩存器
~~~
packagecom.chinaztt.fdv;
importandroid.graphics.Bitmap;
importcom.android.volley.toolbox.ImageLoader;
/**
* 當前類注釋:圖片緩存器,實現ImageLoder.ImageCache實現其中的方法,具體圖片怎么樣緩存讓我們自己來實現
* 這樣可以考慮到將來的擴展性
* 項目名:FastDev4Android
* 包名:com.chinaztt.fdv
* 作者:江清清 on 15/11/12 12:31
* 郵箱:jiangqqlmj@163.com
* QQ: 781931404
* 公司:江蘇中天科技軟件技術有限公司
*/
public class Fdv_ImageCache implements ImageLoader.ImageCache {
@Override
public Bitmap getBitmap(String url) {
return null;
}
@Override
public void putBitmap(String url, Bitmapbitmap) {
}
}
~~~
這邊我創建了一個Fdv_ImagCache類實現ImageLoader.ImageCache接口,并且實現其中的兩個方法,這樣圖片的緩存具體方式讓我們用戶自己來實現,可以增強系統緩存的可擴展性,自定義搞定。這邊我們暫時不具體實現方法直接給了空實現,后面的進階講解中會具體來將這些問題。下面為ImageLoader對象創建:
~~~
ImageLoader imageLoader=new ImageLoader(requestQueue, new Fdv_ImageCache());
~~~
分別傳入請求隊列,以及圖片緩存器即可。
下邊獲取ImageListener監聽器:
~~~
ImageLoader.ImageListener listener=ImageLoader.getImageListener(img_result,R.drawable.ic_loading,R.drawable.ic_loading);
~~~
直接通過ImageLoader的靜態方法getImageListener()來進行獲取,傳入三個參數分別為:
* 需要實現圖片的控件imageview
* 正在加載過程中的默認圖片ID
* 圖片下載失敗顯示的圖片ID
最后使用ImageLoader調用get方法來下載并且顯示圖片
~~~
imageLoader.get("http://interface.zttmall.com//Images//upload//image//20150328//20150328105404_2392.jpg",listener);
~~~
OK這樣就搞定了,讓我們來看效果顯示:

3.5.NetworkImageView使用
最后我們來講一下第三種方式加載圖,NetworkImageView,該為自定義的ImageView控件,對ImageView的功能進行了擴展,加入了圖片下載的功能,具體使用方法如下:
1. 創建RequestQueue對象
2. 創建Imageloader對象
3. 布局文件使用NetworkImageView自定義控件
4. 使用獲取控件調用setImageUrl()方法即可
布局文件如下:
~~~
<com.android.volley.toolbox.NetworkImageView
android:id="@+id/img_result_network"
android:layout_width="300dp"
android:layout_height="300dp"
android:layout_centerHorizontal="true"/>
~~~
間接著創建ImageLoader對象:
~~~
ImageLoader network_imageLoader=new ImageLoader(requestQueue, new Fdv_ImageCache());
~~~
然后獲取NetworkImageView控件并且調用setimageUrl()方法如下:
~~~
img_result_network.setImageUrl("http://interface.zttmall.com//Images//upload//image//20150325//20150325083214_8280.jpg",network_imageLoader);
~~~
??????? setImageUrl()傳入圖片地址以及圖片加載器imageloader,這樣就可以自動下載圖片并且進行顯示,不過在此之前,我們可以對該控件進行相關設置:setDefaultImageResId(),? setErrorImageResId()分別設置默認加載圖片或者圖片下載失敗顯示圖片。
具體實例效果如下:

## (四).結束語:
到此為止我們已經講完了Volley框架的基本介紹以及相關工具的使用(例如:StringRequest,JsonRequest,JsonArrayRequest,ImageRequest,ImageLoader,NetworkImageView等),具體例如Post請求參數修改,圖片緩存器,使用最佳實踐等相關高級進階相關會在下一講中更新。具體實例和框架注釋過的全部代碼已經上傳到FastDev4Android項目中了。
同時歡迎大家去Github站點進行clone或者下載瀏覽:
[https://github.com/jiangqqlmj/FastDev4Android](https://github.com/jiangqqlmj/FastDev4Android)?同時歡迎大家star和fork整個開源快速開發框架項目~
- 前言
- Android快速開發框架介紹(一)
- Android首頁圖片自動無限循環輪播Gallery+FlowIndicator(二)
- Android 列表下拉刷新組件PullToRefreshListView使用(三)
- Android 數據緩存器ACache的詳解和使用(四)
- Android崩潰異常捕捉CustomCrash,提升用戶體驗(五)
- Android實現沉浸式狀態欄(六)
- AndroidAnnnotations注入框架介紹和Android Studios基本配置(七)
- AndroidAnnnotations注入框架的工作原理(八)
- AndroidAnnnotations注入框架使用之注入組件Components(九)
- AndroidAnnnotations注入框架使用之Injection標簽詳解(十)
- AndroidAnnnotations注入框架使用之事件綁定Event Binding(十一)
- AndroidAnnnotations注入框架使用之線程處理Threading(十二)
- AndroidAnnnotations注入框架使用之第三方框架集成RoboGuice(十三)
- AndroidAnnnotations注入框架使用之第三方框架集成Otto事件總線(十四)
- AndroidAnnnotations注入框架使用之第三方框架集成OrmLite(十五)
- AndroidAnnnotations注入框架使用之最佳實踐之Adapters和lists(十六)
- AndroidAnnnotations注入框架使用之最佳實踐SharedPreferences(十七)
- Android MVP開發模式詳解(十九)
- 消息總線EventBus的基本使用(二十)
- 消息總線EventBus源碼分析以及與Otto框架對比(二十一)
- 列表頭生成帶文本或者字母的圖片開源庫TextDrawable使用和詳解(二十二)
- 重寫WebView網頁加載以及JavaScript注入詳解(二十三)
- BaseAdapterHelper的基本使用介紹,讓你擺脫狂寫一堆Adapter煩惱(二十四)
- BaseAdapterHelper詳解源碼分析,讓你擺脫狂寫一堆Adapter煩惱(二十五)
- Volley完全解析之基礎使用(二十六)
- Volley完全解析之進階最佳實踐與二次封裝(二十七)
- RecyclerView完全解析,讓你從此愛上它(二十八)
- RecyclerView完全解析之打造新版類Gallery效果(二十九)
- RecyclerView完全解析之結合AA(Android Annotations)注入框架實例(三十)
- RecyclerView完全解析之下拉刷新與上拉加載SwipeRefreshLayout(三十一)
- CardView完全解析與RecyclerView結合使用(三十二)
- 神器ViewDragHelper完全解析,媽媽再也不擔心我自定義ViewGroup滑動View操作啦~(三十三)
- 神器ViewDragHelper完全解析之詳解實現QQ5.X側滑酷炫效果(三十四)
- 實例解析之SwipeRefreshLayout+RecyclerView+CardView(三十五)
- HorizontalScrollView,Fragment,FragmentStatePagerAdapter打造網易新聞Tab及滑動頁面效果(三十六)
- Android Design支持庫TabLayout打造仿網易新聞Tab標簽效果(三十七)
- 打造QQ6.X最新版本側滑界面效果(三十八)