volley圖片加載有三種方式:android
記得:Volley中已經實現了磁盤緩存了,查看源碼得知經過json
context.getCacheDir()獲取到了 /data/data/<application package>/cache內部存儲路徑,默認大小是5MB.因此咱們只須要再實現內存緩存就能夠了
1. ImageRequest緩存
1 singleImg=(ImageView)findViewById(R.id.volley_img_single_imgeview); 2 ImageRequest imgRequest=new ImageRequest(url, new Response.Listener<Bitmap>() { 3 @Override 4 public void onResponse(Bitmap arg0) { 5 // TODO Auto-generated method stub 6 singleImg.setImageBitmap(arg0); 7 } 8 }, 300, 200, Config.ARGB_8888, new ErrorListener(){ 9 @Override 10 public void onErrorResponse(VolleyError arg0) { 11 // TODO Auto-generated method stub 12 13 } 14 }); 15 mRequestQueue.add(imgRequest);
能夠看到,ImageRequest的構造函數接收六個參數,第一個參數就是圖片的URL地址,這個沒什麼須要解釋的。第二個參數是圖片請求成功的回調,這裏咱們把返回的Bitmap參數設置到ImageView中。第三第四個參數分別用於指定容許圖片最大的寬度和高度,若是指定的網絡圖片的寬度或高度大於這裏的最大值,則會對圖片進行壓縮,指定成0的話就表示無論圖片有多大,都不會進行壓縮。第五個參數用於指定圖片的顏色屬性,Bitmap.Config下的幾個常量均可以在這裏使用,其中ARGB_8888能夠展現最好的顏色屬性,每一個圖片像素佔據4個字節的大小,而RGB_565則表示每一個圖片像素佔據2個字節大小。第六個參數是圖片請求失敗的回調,這裏咱們當請求失敗時在ImageView中顯示一張默認圖片。網絡
最後將這個ImageRequest對象添加到RequestQueue裏就能夠了app
2. ImageLoaderide
1 RequestQueue mRequestQueue = Volley.newRequestQueue(this); 2 final LruCache<String, Bitmap> mImageCache = new LruCache<String, Bitmap>( 3 20); 4 ImageCache imageCache = new ImageCache() { 5 @Override 6 public void putBitmap(String key, Bitmap value) { 7 mImageCache.put(key, value); 8 } 9 10 @Override 11 public Bitmap getBitmap(String key) { 12 return mImageCache.get(key); 13 } 14 }; 15 ImageLoader mImageLoader = new ImageLoader(mRequestQueue, imageCache); 16 // imageView是一個ImageView實例 17 // ImageLoader.getImageListener的第二個參數是默認的圖片resource id 18 // 第三個參數是請求失敗時候的資源id,能夠指定爲0 19 ImageListener listener = ImageLoader 20 .getImageListener(imageView, android.R.drawable.ic_menu_rotate, 21 android.R.drawable.ic_delete); 22 mImageLoader.get(url, listener);
能夠看出ImageLoader這個類須要一個Request的實例以及一個ImageCache的實例。圖片經過一個URL和一個ImageListener實例的get()方法就能夠被加載。從哪裏,ImageLoader會檢查ImageCache,並且若是緩存裏沒有圖片就會從網絡上獲取。Volley的ImageCache接口容許你使用你喜歡的L1緩存實現。不幸的是Volley沒有提供默認的實現。在I/O的介紹中展現了BitmapLruCache的一點代碼片斷,可是Volley這個庫自己並不包含任何相關的實現。函數
ImageCache接口有兩個方法,getBitmap(String url)和putBitmap(String url, Bitmap bitmap).這兩個方法足夠簡單直白,他們能夠添加任何的緩存實現。佈局
3.NetworkImageView學習
除了以上兩種方式以外,Volley還提供了第三種方式來加載網絡圖片,即便用NetworkImageView。不一樣於以上兩種方式,NetworkImageView是一個自定義控制,它是繼承自ImageView的,具有ImageView控件的全部功能,而且在原生的基礎之上加入了加載網絡圖片的功能。NetworkImageView控件的用法要比前兩種方式更加簡單,大體能夠分爲如下五步:this
1. 建立一個RequestQueue對象。
2. 建立一個ImageLoader對象。
3. 在佈局文件中添加一個NetworkImageView控件。
4. 在代碼中獲取該控件的實例。
5. 設置要加載的圖片地址。
其中,第一第二步和ImageLoader的用法是徹底同樣的,所以這裏咱們就從第三步開始學習了。首先修改佈局文件中的代碼,在裏面加入NetworkImageView控件,以下所示
XML
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <Button android:id="@+id/button" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Send Request" /> <com.android.volley.toolbox.NetworkImageView android:id="@+id/network_image_view" android:layout_width="200dp" android:layout_height="200dp" android:layout_gravity="center_horizontal" /> </LinearLayout>
接着在Activity獲取到這個控件的實例,代碼以下所示:
networkImageView = (NetworkImageView) findViewById(R.id.network_image_view);
NetworkImageView控件的實例以後,咱們能夠調用它的setDefaultImageResId()方法、setErrorImageResId()方法和setImageUrl()方法來分別設置加載中顯示的圖片, 加載失敗時顯示的圖片,以及目標圖片的URL地址,以下所示:
1 networkImageView.setDefaultImageResId(R.drawable.default_image); 2 3 networkImageView.setErrorImageResId(R.drawable.failed_image); 4 5 networkImageView.setImageUrl("http://img.my.csdn.net/uploads/201404/13/1397393290_5765.jpeg", imageLoader);
好了,就是這麼簡單,如今從新運行一下程序,你將看到和使用ImageLoader來加載圖片如出一轍的效果,這裏我就再也不截圖了。
這時有的朋友可能就會問了,使用ImageRequest和ImageLoader這兩種方式來加載網絡圖片,均可以傳入一個最大寬度和高度的參數來對圖片進行壓縮,而NetworkImageView中則徹底沒有提供設置最大寬度和高度的方法,那麼是否是使用NetworkImageView來加載的圖片都不會進行壓縮呢?
其實並非這樣的,NetworkImageView並不須要提供任何設置最大寬高的方法也可以對加載的圖片進行壓縮。這是因爲NetworkImageView是一個控件,在加載圖片的時候它會自動獲取自身的寬高,而後對比網絡圖片的寬度,再決定是否須要對圖片進行壓縮。也就是說,壓縮過程是在內部徹底自動化的,並不須要咱們關心,NetworkImageView會始終呈現給咱們一張大小剛恰好的網絡圖片,不會多佔用任何一點內存,這也是NetworkImageView最簡單好用的一點吧。
固然了,若是你不想對圖片進行壓縮的話,其實也很簡單,只須要在佈局文件中把NetworkImageView的layout_width和layout_height都設置成wrap_content就能夠了,這樣NetworkImageView就會將該圖片的原始大小展現出來,不會進行任何壓縮。
這樣咱們就把使用Volley來加載網絡圖片的用法都學習完了。
下一篇咱們繼續介紹Volley中的json處理..........