Android網絡通訊框架Volley總結

  1.什麼是Volley?

    Volley是一個網絡通訊庫,它是對網絡操做的一個封裝框架,可以簡化網絡的相關操做,同時使網絡更快、更簡單、更健壯。java

 

  2.Volley有什麼用?

      

      上面這張圖是在2013年Google I/O 大會中,引入Volley時所採用的圖,因爲Volley是一個網絡通訊庫,那麼這張圖能夠很清晰的告訴咱們Volley使用的場景,便是適用於數據量不大可是網絡通訊很頻繁的時候,如JSON/XML文本數據或圖片加載等操做,不適用與大量數據的網絡操做,如大數據的下載,文件上傳和流媒體。android

 

    複習:Android中網絡通訊經常使用類:HttpURLConnection、HttpClient、AsyncTask、AsyncTaskLoader、Thread+handler等。算法

 

  3.Volley原理

    Volley使用線程池做爲基本結構:線程分爲main threadcache threadnetwork thread.緩存

     結構圖:網絡

    

    

 

  4.Volley的使用

    任意建立一個規範的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 工具類

 

 

 

    

    

 

    使用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                 });
ImageRequest類的使用

 

    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         });
ImageLoader類的初始化
      
 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));
ImageLoader類的使用

 

    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>
NetworkImageView在XML文件中使用

 

     
1  //NetworkImageView
2         NetworkImageView networkImageView = (NetworkImageView) findViewById(R.id.networkImageView);
3         networkImageView.setImageUrl(url,imageLoader);
NetworkImageView的使用

 

    

    未完,待續。

相關文章
相關標籤/搜索