Android學習之volley

Volley 除了簡單易用以外,在性能方面也進行了大幅度的調整,它的設計目標就是很是適合去進行數據量不大,但通訊頻繁的網絡操做,而不能用於大數據量的網絡操做,好比說下載文件等。
 
導包並在build.gradle中加入這句話:
compile 'eu.the4thfloor.volley:com.android.volley:2015.05.28'
 
使用:

(一)StringRequest

1,下載String類型數據
(1)首先:須要獲取到一個RequestQueue(消息隊列)對象

  

RequestQueue requestQueue; requestQueue = Volley.newRequestQueue(this); 

 

 
(2)要發出一條HTTP請求,咱們還須要建立一個StringRequest對象:
StringRequest stringRequest = new StringRequest("", new Response.Listener<String>() { @Override public void onResponse(String response) { } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { } });

 

構造方法:
 
第一個參數:  請求地址
第二個參數: 請求成功監聽器
第三個參數: 請求失敗
StringRequest(String url, Listener<String> listener, ErrorListener errorListener)(GET請求)

 

 
第一個參數: 請求方式
第二個參數:  請求地址
第三個參數: 請求成功監聽器(數據返回就在這裏,不論是正確的仍是錯誤的)
第四個參數: 請求失敗(指網絡失敗,沒有返回數據,網絡中斷等緣由形成的請求失敗)
StringRequest(int method, String url, Listener<String> listener,ErrorListener errorListener) 

 

(3)將這個StringRequest對象添加到RequestQueue裏面
 
requestQueue.add(stringRequest);

 

(4)添加訪問網絡的權限
 
<uses-permission android:name="android.permission.INTERNET"></uses-permission>

(二)JsonRequest

 
JsonRequest的用法。相似於StringRequest;
JsonRequest是一個抽象類,所以咱們沒法直接建立它的實例,那麼只能從它的子類入手了;
JsonRequest有兩個直接的子類:
JsonObjectRequest:用於請求一段JSON數據
JsonArrayRequest: 用於請求一段JSON數組
 
使用步驟:
(1)new 一個JsonRequest對象 
    1. JsonObjectRequest jsonObjectRequest = new JsonObjectRequest("http://m.weather.com.cn/data/101010100.html", null, new Response.Listener<JSONObject>() { @Override public void onResponse(JSONObject response) { //服務端響應成功,返回數據 
                      Log.d("TAG", response.toString()); } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { //服務端響應失敗
                      Log.e("TAG", error.getMessage(), error); } }); 

       

 
(2)將這個對象添加到消息隊列中
 
  注意點:  服務器返回給咱們的數據是JSON格式的
 

(三)ImageRequest

ImageRequest 與StringRequest和JsonRequest相似,都是繼承自Request,用法也相似,三者的使用步驟以下:

1. 建立一個RequestQueue對象。html

2. 建立一個Request對象。android

3. 將Request對象添加到RequestQueue裏面。json

 

不一樣的只是名稱和構造函數不一樣罷了。數組

 

(1)ImageRequest 構建對象:緩存

    1. ImageRequest imageRequest = new ImageRequest( "http://developer.android.com/images/home/aw_dac.png", new Response.Listener<Bitmap>() { @Override public void onResponse(Bitmap response) { imageView.setImageBitmap(response); } }, 0, 0, Config.RGB_565, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { imageView.setImageResource(R.drawable.default_image); } });   
 
  
構造函數爲:  
   ImageRequest(String url, Response.Listener<Bitmap> listener, int maxWidth, int maxHeight,Config decodeConfig, Response.ErrorListener errorListener) 

 

六個參數:服務器

  第一個參數:url  圖片的URL地址網絡

  第二個參數: 圖片請求成功的回調ide

  第3、第四個參數:指定的網絡圖片的最大寬度和最大高度,若是寬高度與指定不符,則進行壓縮,若是都設置爲0 ,就是不會壓縮函數

  第五個參數:指定圖片的顏色屬性工具

  第六個參數:圖片請求失敗的回調

 

 

(2) 將此對象添加到消息隊列中便可。

 (四)ImageLoader

 

  ImageLoader要比ImageRequest更加高效,由於它不只能夠幫咱們對圖片進行緩存,還能夠過濾掉重複的連接,避免重複發送請求;

 

因爲ImageLoader已經不是繼承自Request的了,因此其用法也和咱們以前學到的內容有所不一樣,總結起來大體能夠分爲如下四步:

1. 建立一個RequestQueue對象。

2. 建立一個ImageLoader對象。

3. 獲取一個ImageListener對象。

4. 調用ImageLoader的get()方法加載網絡上的圖片。

以下: 
 
1. 新建圖片獲取加載工具對象,利用緩存
建立緩存:
long l = Runtime.getRuntime().totalMemory()/8 ; final LruCache<String, Bitmap> lruCache = new LruCache<String, Bitmap>((int) l) {//此處l是上面獲取的程序當前程序的8分之一
 @Override protected int sizeOf(String key, Bitmap value) {//返回每一個緩存的大小
        return value.getRowBytes() * value.getHeight() / 1024; } };// 建立系統自帶的緩存,緩存最大值爲內存最大值的1/8

 

2,新建ImageLoader對象
構造函數:
兩個參數:
第一個參數就是RequestQueue對象
第二個參數是一個ImageCache對象
ImageLoader imageLoader; imageLoader = new ImageLoader(requestQueue, new ImageLoader.ImageCache() { @Override public Bitmap getBitmap(String url) {//從緩存中獲取圖片,是在 get 方法執行的時候纔來,由於須要 url
        LogUitls.e("volley", "獲取緩存圖片"); Bitmap bitmap = lruCache.get(url); return bitmap; } @Override public void putBitmap(String url, Bitmap bitmap) {//往緩存中存放圖片,這裏的URL值是什麼?緩存地址仍是上面的下載地址?
        LogUitls.e("volley", "將圖片存放到緩存中"); lruCache.put(url, bitmap); } });

 

 
  
(3)get方法
get方法參數:
第一個參數:圖片的URL地址
第二個參數:ImageListener對象
 
  
ImageListener構造函數參數:
第一個參數:要顯示圖片的控件
第二個參數:加載圖片的過程當中顯示的圖片
第三個參數: 加載圖片失敗的狀況下顯示的圖片
imageLoader.get("http://www.baidu.com/img/bd_logo1.png", ImageLoader.getImageListener(imageView, R.mipmap.ic_launcher, R.mipmap.ic_launcher));

 

ImageLoader.getImageListener的缺點:僅適合沒有複用控件的時候使用, listview 中使用會致使錯亂,由於沒有判斷返回的圖片

(五)NetworkImageView

 

NetworkImageView是一個自定義控制,它是繼承自ImageView的,具有ImageView控件的全部功能,而且在原生的基礎之上加入了加載網絡圖片的功能。

NetworkImageView控件的用法要比前兩種方式更加簡單,大體能夠分爲如下五步:

1. 建立一個RequestQueue對象。

2. 建立一個ImageLoader對象。

3. 在佈局文件中添加一個NetworkImageView控件。

4. 在代碼中獲取該控件的實例。

5. 設置要加載的圖片地址。


從第三步起:
    先設置控件:
  1. <com.android.volley.toolbox.NetworkImageView android:id="@+id/network_image_view" android:layout_width="200dp" android:layout_height="200dp" android:layout_gravity="center_horizontal"  
            /> 
     

     

   接着在Activity獲取到這個控件的實例。
 
而後調用此控件的方法給它設置加載中顯示的圖片和加載失敗後顯示的圖片、圖片的URL地址。
 
  1. networkImageView.setDefaultImageResId(R.drawable.default_image); networkImageView.setErrorImageResId(R.drawable.failed_image); networkImageView.setImageUrl("http://img.my.csdn.net/uploads/201404/13/1397393290_5765.jpeg", imageLoader); 

     

由此看來,NetworkImageView控件比上述的兩種方法更加簡便,且NetworkImageView並不須要提供任何設置最大寬高的方法也可以對加載的圖片進行壓縮。
這是由於NetworkImageView是一個控件,在加載圖片的時候它會自動獲取自身的寬高,而後對比網絡圖片的寬度,再決定是否須要對圖片進行壓縮。
 
若是你不想對圖片進行壓縮的話,其實也很簡單,只須要在佈局文件中把NetworkImageView的layout_width和layout_height都設置成wrap_content就能夠了,這樣NetworkImageView就會將該圖片的原始大小展現出來,不會進行任何壓縮。
相關文章
相關標籤/搜索