網絡通信框架Volley使用詳細說明

前一篇粗略的介紹了一下Volley,並在最後附上了一段使用代碼,這一篇詳細的介紹一下Volley的使用。前面也說了Volley主要獲取JSON對象和圖片加載,這裏也分爲兩部分介紹。

1、獲取JSON對象

1.1聲明RequestQueue

聲明一個新的RequestQueue對象
[java] view plain copy
 print?
  1. private RequestQueue mRequestQueue;  
 
onCreate初始化mRequestQueue
[java] view plain copy
 print?
  1. mRequestQueue =  Volley.newRequestQueue(this);  

1.2 聲明並使用Request

[java] view plain copy
 print?
  1. JsonObjectRequest jr = new JsonObjectRequest(Request.Method.GET,url,null,new Response.Listener<JSONObject>() {  
  2.             @Override  
  3.             public void onResponse(JSONObject response) {  
  4.                 Log.i(TAG,response.toString());  
  5.                 parseJSON(response);  
  6.                 va.notifyDataSetChanged();  
  7.                 pd.dismiss();  
  8.             }  
  9.         },new Response.ErrorListener() {  
  10.             @Override  
  11.             public void onErrorResponse(VolleyError error) {  
  12.                 Log.i(TAG,error.getMessage());  
  13.             }  
  14.         });  
  15.         mRequestQueue.add(jr);  


Volley提供了JsonObjectRequest、JsonArrayRequest、StringRequest等Request形式。

JsonObjectRequest:返回JSON對象。

JsonArrayRequest:返回JsonArray。

StringRequest:返回String,這樣可以自己處理數據,更加靈活。

另外可以繼承Request<T>自定義Request。


1.3 取消Request

      Activity裏面啓動了網絡請求,而在這個網絡請求還沒返回結果的時候,Activity被結束了,此時如果繼續使用其中的Context等,除了無辜的浪費CPU,電池,網絡等資源,有可能還會導致程序crash,所以,我們需要處理這種一場情況。使用Volley的話,我們可以在Activity停止的時候,同時取消所有或部分未完成的網絡請求。Volley裏所有的請求結果會返回給主進程,如果在主進程裏取消了某些請求,則這些請求將不會被返回給主線程。Volley支持多種request取消方式。
1)可以針對某些個request做取消操作:


[java] view plain copy
 print?
  1. @Override  
  2.    public void onStop() {  
  3.        for (Request <?> req : mRequestQueue) {  
  4.            req.cancel();  
  5.        }  
  6.    }  

2)取消這個隊列裏的所有請求:

[java] view plain copy
 print?
  1. @Override  
  2. protected void onStop() {  
  3.     // TODO Auto-generated method stub  
  4.     super.onStop();  
  5.     mRequestQueue.cancelAll(this);  
  6. }  

3)可以根據RequestFilter或者Tag來終止某些請求
[java] view plain copy
 print?
  1. @Override  
  2. rotected void onStop() {  
  3. // TODO Auto-generated method stub  
  4. super.onStop();  
  5.   
  6. mRequestQueue.cancelAll( new RequestFilter() {});  
  7. or  
  8. mRequestQueue.cancelAll(new Object());  
  9.   
  10.    


Volley支持http的GET、POST、PUT、DELETE等方法,上面給出了GET方法,其他方法請參考



2、圖片加載

2.1使用ImageRequest下載圖片

    Volley提供了多種Request方法,ImageRequest能夠處理單張圖片,返回bitmap。下面是ImageRequest的使用例子,和JsonRequest的一樣。
[java] view plain copy
 print?
  1. singleImg=(ImageView)findViewById(R.id.volley_img_single_imgeview);  
  2.         ImageRequest imgRequest=new ImageRequest(url, new Response.Listener<Bitmap>() {  
  3.             @Override  
  4.             public void onResponse(Bitmap arg0) {  
  5.                 // TODO Auto-generated method stub  
  6.                 singleImg.setImageBitmap(arg0);  
  7.             }  
  8.         }, 300200, Config.ARGB_8888, new ErrorListener(){  
  9.             @Override  
  10.             public void onErrorResponse(VolleyError arg0) {  
  11.                 // TODO Auto-generated method stub  
  12.                   
  13.             }             
  14.         });  
  15.         mRequestQueue.add(imgRequest);  


2.2使用ImageLoader

    ImageLoader這個類需要一個Request的實例以及一個ImageCache的實例。圖片通過一個URL和一個ImageListener實例的get()方法就可以被加載。從哪裏,ImageLoader會檢查ImageCache,而且如果緩存裏沒有圖片就會從網絡上獲取。

    Volley的ImageCache接口允許你使用你喜歡的L1緩存實現。不幸的是Volley沒有提供默認的實現。在I/O的介紹中展示了BitmapLruCache的一點代碼片段,但是Volley這個庫本身並不包含任何相關的實現。

    ImageCache接口有兩個方法,getBitmap(String url)和putBitmap(String url, Bitmap bitmap).這兩個方法足夠簡單直白,他們可以添加任何的緩存實現。

[java] view plain copy
 print?
  1. RequestQueue mRequestQueue = Volley.newRequestQueue(this);  
  2.         final LruCache<String, Bitmap> mImageCache = new LruCache<String, Bitmap>(  
  3.                 20);  
  4.         ImageCache imageCache = new ImageCache() {  
  5.             @Override  
  6.             public void putBitmap(String key, Bitmap value) {  
  7.                 mImageCache.put(key, value);  
  8.             }  
  9.   
  10.             @Override  
  11.             public Bitmap getBitmap(String key) {  
  12.                 return mImageCache.get(key);  
  13.             }  
  14.         };  
  15.         ImageLoader mImageLoader = new ImageLoader(mRequestQueue, imageCache);  
  16.         // imageView是一個ImageView實例  
  17.         // ImageLoader.getImageListener的第二個參數是默認的圖片resource id  
  18.         // 第三個參數是請求失敗時候的資源id,可以指定爲0  
  19.         ImageListener listener = ImageLoader  
  20.                 .getImageListener(imageView, android.R.drawable.ic_menu_rotate,  
  21.                         android.R.drawable.ic_delete);  
  22.         mImageLoader.get(url, listener);  


2.3 使用NetworkImageView


[java] view plain copy
 print?
  1. public class NetworkImageView extends ImageView  
繼承自ImageView,添加了一個
[java] view plain copy
 print?
  1. public void setImageUrl(String url, ImageLoader imageLoader) {}  
方法,參數包含一個Url地址和一個ImageLoader對象
核心方法:
[java] view plain copy
 print?
  1. private void loadImageIfNecessary(final boolean isInLayoutPass) {}  
內部實現,boolean 類型參數代表是否重新請求網絡 ,true:重新請求 false:取緩存
內部實現和ImageLoader類似,都是通過ImageContainer中new一個ImageListener,在ImageListener,只是做了Url的空判斷,如果Url爲null,則調用ImageContainer.cancelRequest();取消請求。
覆寫方法:
 
[java] view plain copy
 print?
  1. @Override  
  2. protected void onLayout(boolean changed, int left, int top, int right, int bottom) {  
  3. super.onLayout(changed, left, top, right, bottom);  
  4. //onLayout時重新請求  
  5. loadImageIfNecessary(true);  
  6. }  
  7. @Override  
  8. protected void onDetachedFromWindow() {  
  9. //銷燬View的時候Release操作  
  10. if (mImageContainer != null) {  
  11. // If the view was bound to an image request, cancel it and clear  
  12. // out the image from the view.  
  13. mImageContainer.cancelRequest();  
  14. setImageBitmap(null);  
  15. // also clear out the container so we can reload the image if necessary.  
  16. mImageContainer = null;  
  17. }  
  18. super.onDetachedFromWindow();  
  19. }  
  20. //drawable狀態改變重繪  
  21. @Override  
  22. protected void drawableStateChanged() {  
  23. super.drawableStateChanged();  
  24. invalidate();  
  25. }  


    總結:網絡請求下載圖片顯示,可以使用此控件,比傳統的ImageView多了網絡處理,也添加了2個方法,設置開始下載的默認圖和下載出錯後顯示圖。

[java] view plain copy
 print?
  1. /** 
  2. * Sets the default image resource ID to be used for this view until the attempt to load it 
  3. * completes. 
  4. */  
  5. public void setDefaultImageResId(int defaultImage) {  
  6. mDefaultImageId = defaultImage;  
  7. }  
  8. /** 
  9. * Sets the error image resource ID to be used for this view in the event that the image 
  10. * requested fails to load. 
  11. */  
  12. public void setErrorImageResId(int errorImage) {  
  13. mErrorImageId = errorImage;  
  14. }  
發佈了14 篇原創文章 · 獲贊 3 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章