Volley是一個網絡通訊庫,它是對網絡操做的一個封裝框架,可以簡化網絡的相關操做,同時使網絡更快、更簡單、更健壯。java
上面這張圖是在2013年Google I/O 大會中,引入Volley時所採用的圖,因爲Volley是一個網絡通訊庫,那麼這張圖能夠很清晰的告訴咱們Volley使用的場景,便是適用於數據量不大可是網絡通訊很頻繁的時候,如JSON/XML文本數據或圖片加載等操做,不適用與大量數據的網絡操做,如大數據的下載,文件上傳和流媒體。android
複習:Android中網絡通訊經常使用類:HttpURLConnection、HttpClient、AsyncTask、AsyncTaskLoader、Thread+handler等。算法
Volley使用線程池做爲基本結構:線程分爲main thread,cache thread,network thread.緩存
結構圖:網絡
任意建立一個規範的Android項目,而後在src目錄下新建一個包com.android.volly,將Volleyball源碼拷到這個包下就能夠了。框架
核心代碼:ide
能夠將全部的操做封裝成一個工具類,這裏RequestQueue類和ImageLoader類在內存中始終只存在一個對象:工具
1 package com.qf.utils; 2 3 import java.io.IOException; 4 import java.lang.ref.SoftReference; 5 import java.util.HashMap; 6 import java.util.Map; 7 8 import android.content.Context; 9 import android.graphics.Bitmap; 10 import android.support.v4.util.LruCache; 11 12 import com.android.volley.RequestQueue; 13 import com.android.volley.toolbox.ImageLoader; 14 import com.android.volley.toolbox.Volley; 15 16 public class VolleyUtils { 17 18 public static RequestQueue mQueue; 19 public static ImageLoader mLoader; 20 21 private static LruCache<String,Bitmap> lruCache;//強引用緩存,一級緩存,特色:使用最近最少使用的算法,將舊數據移除,爲新數據提供空間 22 private static Map<String,SoftReference<Bitmap>> softCache; //軟引用緩存,二級緩存 23 24 25 public static RequestQueue getQueue(Context context){ 26 if(mQueue==null){ 27 mQueue=Volley.newRequestQueue(context); 28 } 29 30 return mQueue; 31 } 32 33 public static ImageLoader getLoader(Context context){ 34 if(mLoader==null){ 35 //實例化二級緩存 36 softCache=new HashMap<String, SoftReference<Bitmap>>(); 37 38 //實例化一級緩存 39 lruCache=new LruCache<String, Bitmap>(2*1024*1024){ //緩存的內存空間爲2M 40 @Override 41 protected int sizeOf(String key, Bitmap value) { 42 // TODO 計算存放成員的大小,返回字節大小 43 return value.getRowBytes()*value.getHeight(); 44 } 45 46 @Override 47 protected void entryRemoved(boolean evicted, String key, 48 Bitmap oldValue, Bitmap newValue) { 49 // TODO 移除舊成員 50 51 if(evicted) 52 //將移除的成員存放到二級緩存中 53 softCache.put(key, new SoftReference<Bitmap>(oldValue)); 54 55 super.entryRemoved(evicted, key, oldValue, newValue); 56 } 57 }; 58 59 mLoader=new ImageLoader(getQueue(context), new ImageLoader.ImageCache() { 60 61 @Override 62 public void putBitmap(String url, Bitmap bitmap) { 63 // TODO 將圖片存放在緩存中的方法 64 //將圖片存放在一級緩存中 65 lruCache.put(url, bitmap); 66 67 //將圖片也存放在擴展卡 68 try { 69 ImageUtils.saveImg(url, bitmap); 70 } catch (IOException e) { 71 e.printStackTrace(); 72 } 73 } 74 75 @Override 76 public Bitmap getBitmap(String url) { 77 // TODO 從緩存中讀取圖片的方法 78 //先從一級緩存中獲取 79 Bitmap b=lruCache.get(url); 80 if(b==null){ 81 //從二級緩存中讀取 82 SoftReference<Bitmap> reference=softCache.get(url); 83 if(reference!=null){ //二級緩存中存在 84 b=reference.get(); 85 if(b!=null){ 86 //將圖片對象存放在一級緩存 87 lruCache.put(url, b); 88 89 //從二級緩存中移除 90 softCache.remove(reference); 91 } 92 }else{ //從三級緩存中讀取--擴展卡 93 b=ImageUtils.getImg(url); 94 if(b!=null){ 95 //將圖片存放到一級緩存中 96 lruCache.put(url, b); 97 } 98 } 99 } 100 return b; 101 } 102 }); 103 } 104 105 return mLoader; 106 } 107 108 }
使用Volley獲取網絡圖片的三種方法:大數據
1. ImageRequest類url
1 // 參數2: 圖片下載成功, 自動回調這個接口 2 // 參數3: 內存中Bitmap 最大的寬度限制,用於下降內存的消耗 3 // 參數4:內存中 Bitmap 最大的高度限制,用於下降內存的消耗 4 // 參數5:告訴 BitmapFactory,在生成Bitmap的時候,一個像素,包含的信息 5 // 參數 6:圖片加載失敗的時候,回調 6 ImageRequest request = new ImageRequest(url, 7 new Response.Listener<Bitmap>() { 8 @Override 9 public void onResponse(Bitmap response) { 10 imageView.setImageBitmap(response); 11 } 12 } 13 ,200,100,Bitmap.Config.ARGB_8888, 14 new Response.ErrorListener() { 15 @Override 16 public void onErrorResponse(VolleyError error) { 17 imageView.setImageResource(R.drawable.ic_launcher); 18 } 19 });
2.ImageLoader類
1 // 參數1 : 用於實際的網絡請求 2 // 參數2 : ImageCache 內存緩存 3 imageLoader = new ImageLoader(requestQueue, new ImageLoader.ImageCache() { 4 LruCache<String,Bitmap> cache = new LruCache<>(10); 5 @Override 6 public Bitmap getBitmap(String url) { 7 return cache.get(url); 8 } 9 10 @Override 11 public void putBitmap(String url, Bitmap bitmap) { 12 cache.put(url,bitmap); 13 } 14 });
1 //方法1 2 /*imageLoader.get(url, new ImageLoader.ImageListener() { 3 @Override 4 public void onResponse(ImageLoader.ImageContainer response, boolean isImmediate) { 5 // TODO 設置圖片 6 } 7 8 @Override 9 public void onErrorResponse(VolleyError error) { 10 // TODO 設置失敗圖片 11 } 12 });*/ 13 14 //方法2 15 ImageView imageView = (ImageView) findViewById(R.id.imageView); 16 imageLoader.get(url+"sdf", 17 ImageLoader.getImageListener(imageView,R.drawable.ic_launcher,android.R.drawable.ic_delete));
3.NetworkImageView類
NetworkImageVIew類時Volley自定義的一個類,它繼承ImageView,在XML文件中能夠像ImageView控件同樣使用,與ImageView的使用沒有區別,只是NetworkImageView是用來加載網絡圖片的ImageView。
1 <?xml version="1.0" encoding="utf-8"?> 2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 3 android:orientation="vertical" 4 android:layout_width="fill_parent" 5 android:layout_height="fill_parent" 6 > 7 8 <ImageView 9 android:id="@+id/imageView" 10 android:layout_width="wrap_content" 11 android:layout_height="wrap_content" 12 /> 13 <com.android.volley.toolbox.NetworkImageView 14 android:id="@+id/networkImageView" 15 android:layout_width="wrap_content" 16 android:layout_height="wrap_content" 17 /> 18 <android.support.v4.view.ViewPager 19 android:id="@+id/viewPager" 20 android:layout_width="match_parent" 21 android:layout_height="match_parent"/> 22 23 </LinearLayout>
1 //NetworkImageView 2 NetworkImageView networkImageView = (NetworkImageView) findViewById(R.id.networkImageView); 3 networkImageView.setImageUrl(url,imageLoader);
未完,待續。