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"/>