volley圖片加載有三種方式:
記得:Volley中已經實現了磁盤緩存了,查看源碼得知通過
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里就可以了
2. ImageLoader
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控件的用法要比前兩種方式更加簡單,大致可以分為以下五步:
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處理..........