天天看點

Android開發利用Volley架構下載下傳和緩存網絡圖檔

      2013年Google I/O大會上推出了一種新的網絡通信架構——Volley,Volley可是說是把AsyncHttpClient和Universal-Image-Loader的優點集于了一身,既可以像AsyncHttpClient一樣非常簡單地進行HTTP通信,也可以像Universal-Image-Loader一樣輕松加載網絡上的圖檔。除了簡單易用之外,Volley在性能方面也進行了大幅度的調整,它的設計目标就是非常适合去進行資料量不大,但通信頻繁的網絡操作,而對于大資料量的網絡操作,比如說下載下傳檔案等,Volley的表現就會非常糟糕。volley.jar下載下傳

一.使用Volley架構下載下傳網絡圖檔

(1)首先,建立Application類,聲明并且執行個體話RequestQueue。

在App.java檔案中:

public class App extends Application

{

     private static RequestQueuequeues;// Volley加載隊列

     @Override

     public void onCreate()

     {

          super.onCreate();

          queues =Volley.newRequestQueue(getApplicationContext());// 實列話

     }

}

[注意]需要在AndroidManifest.xml中配置這個APP類:

<application

       android:name=".App"

       android:allowBackup="true"

       android:icon="@drawable/ic_launcher"

       android:label="@string/app_name"

       android:theme="@style/AppTheme">

...........

</application>

(2)在需要下載下傳圖檔的地方,使用Volley架構進行網絡操作(如ListView的Adapter中,在getView方法中可以使用)

ImageView iv = (ImageView)findViewById(R.id.iv);

String url = "http://.............../test.png"  // 圖檔的位址

ImageRequest request =new ImageRequest(url,new Listener<Bitmap>()

{

     @Override

     public void onResponse(Bitmap response)

     {// 加載成功,顯示頭像

          iv.setImageBitmap(response);

     }

},0,0,Config.RGB_565,new ErrorListener()

{

     @Override

     public void onErrorResponse(VolleyError error)

     { // 加載出錯調用的函數

          iv.setImageBitmap(BitmapFactory.decodeResource(this.getResources(), R.drawable.error));

     }

});

if (! url.equals(""))

{     

      App.getHttpQueue().add(request);

}

[說明]

Volley.ImageRequest(String url,Listener<Bitmap> listener, int maxWidth, int maxHeight,Config decodeConfig,ErrorListener errorListener)

url:為圖檔下載下傳的位址;

listener:為下載下傳成功的監聽, 其onResponse方法中的Bitmap對象就是獲得成功之後得到的圖檔(Bitmap response);

maxWidth與maxHeight:與系統對圖檔處理(壓縮和拉伸),若設定為0,則系統不對圖檔進行這些處理;

errorListener:拉取圖檔出錯的監聽。

[注意]上面的方法,實作了數量不大,但頻繁的網絡加載圖檔的操作,可以用在ListView圖檔加載以及單一圖檔加載的過程,但是有一個缺點,比如在ListView中加載,會加載目前現實的ListView的Item的圖檔,上下滑動的過程中,對于顯示出的Item,會重制進行網絡下載下傳,這樣就浪費了流量,是以我們需要結合圖檔緩存機制和Volley一起進行網絡圖檔加載使用。

二.Volley架構+BitmapCache進行網絡圖檔加載和緩存

(1)首先,建立Application類,聲明并且執行個體話RequestQueue。

在APP.java檔案中:

public class APP extends Application

{

     private static RequestQueue queues; // Volley加載隊列

     @Override

     public void onCreate()

     {

          super.onCreate();

          queues = Volley.newRequestQueue(getApplicationContext()); // 實列話

     }

}

[注意]需要在AndroidManifest.xml中配置這個APP類:

<application

        android:name=".App"

        android:allowBackup="true"

        android:icon="@drawable/ic_launcher"

        android:label="@string/app_name"

        android:theme="@style/AppTheme" >

...........

</application>

(2).建立圖檔緩存類BitmapCache.java(借助了LruCache實作緩存)

import android.graphics.Bitmap;

import android.support.v4.util.LruCache;

import com.android.volley.toolbox.ImageLoader.ImageCache;

//用來圖檔緩存的類

public class BitmapCache implements ImageCache

{

     public LruCache<String,Bitmap>cache;

     public int max =10 *1024 *1024;// 設定緩存的最大為10M

     public BitmapCache()

     {

          cache =new LruCache<String,Bitmap>(max)

          {

               @Override

               protected int sizeOf(String key,Bitmap value)

               {

                    return value.getRowBytes() *value.getHeight();

               }

          };

}

     @Override

     public Bitmap getBitmap(String url)

     {

          returncache.get(url);

     }

     @Override

     public void putBitmap(String url,Bitmap bitmap)

     {

          cache.put(url,bitmap);

     }

}

(3)調用Volley進行下載下傳和緩存圖檔:

String url = "http://.........../test.png";

ImageView img = (ImageView)findViewById(R.id.img);

ImageLoader loader =new ImageLoader(App.getHttpQueue(),new BitmapCache());

ImageListener listener =ImageLoader.getImageListener(img,R.drawable.default_icon,R.drawable.error_icon);

loader.get(url, listener);

<注意>上面的操作由于需要網絡支援,以及會在記憶體中讀寫内容,是以需要在AndroidManifest.xml中加入必要的操作權限:

<uses-permissionandroid:name="android.permission.INTERNET"/>

<uses-permissionandroid:name="android.permission.WRITE_EXTERNAL_STORAGE"/>