前面分享了Volley用於一般網絡數據請求的方法,http://www.linuxidc.com/Linux/2016-11/137271.htm
今天來說一下Volley用於網絡圖片的請求,首先來看ImageRequest,這個跟之前的StringRequest很類似,代碼如下:
RequestQueue requestQueue = Volley.newRequestQueue(this);
ImageRequest imageRequest = new ImageRequest("網絡圖片地址", new Response.Listener<Bitmap>() {
@Override
public void onResponse(Bitmap response) {
}
@Override
public void onResponseHeaders(Map<String, String> headers) {
}
}, 100, 100, Bitmap.Config.ARGB_8888, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
}
});
requestQueue.add(imageRequest);
也是先定義一個RequestQueue ,然後定義ImageRequest,第一個參數就是網絡圖片的加載地址,第二個參數是成功返回的結果,第三和第四個參數是指定圖片壓縮的大小,如果是0,0就是保持原來的圖片大小,不壓縮,第五個參數是返回錯誤的結果,然後加入到RequestQueue 中,很簡單吧,接下來我們來看下Volley提供的更加強大的ImageLoader,ImageLoader內部也是調用的ImageRequest,但是增加了比如默認的圖片,錯誤的圖片,還有緩存等等,看如下代碼:
RequestQueue requestQueue1 = Volley.newRequestQueue(this);
ImageLoader imageLoader = new ImageLoader(requestQueue1, new BitmapCache());
ImageLoader.ImageListener listener = ImageLoader.getImageListener(imageView,
R.drawable.default_image, R.drawable.failed_image);
imageLoader.get("網絡圖片地址",listener);
依然是先定義一個RequestQueue ,然後定義ImageLoader ,第一個參數就是剛才定義的RequestQueue ,第二個參數是一個ImageCache緩存類,這個待會再說,然後定義了一個ImageListener ,這個ImageListener 第一個參數是我們要設置的圖片view,第二個參數是默認加載的圖片,第三個參數是當發生錯誤時加載的圖片,我在上一篇文章中分享過圖片緩存的方式,http://blog.csdn.net/swjtufq/article/details/52651084,下面我們就在ImageCache中把LruCache緩存的方式用上,代碼如下:
class BitmapCache implements ImageLoader.ImageCache{
private LruCache<String,Bitmap> mMemoryCache;
public BitmapCache(){
int maxMemory = (int) (Runtime.getRuntime().maxMemory() / 1024);
int cacheSize = maxMemory / 8;
mMemoryCache = new LruCache<String, Bitmap>(cacheSize) {
@Override
protected int sizeOf(String key, Bitmap bitmap) {
return bitmap.getRowBytes() * bitmap.getHeight() / 1024;
}
};
}
@Override
public Bitmap getBitmap(String url) {
String key = hashKeyFormUrl(url);
return mMemoryCache.get(key);
}
@Override
public void putBitmap(String url, Bitmap bitmap) {
String key = hashKeyFormUrl(url);
mMemoryCache.put(key,bitmap);
}
private String hashKeyFormUrl(String url) {
String cacheKey;
try {
final MessageDigest mDigest = MessageDigest.getInstance("MD5");
mDigest.update(url.getBytes());
cacheKey = bytesToHexString(mDigest.digest());
} catch (NoSuchAlgorithmException e) {
cacheKey = String.valueOf(url.hashCode());
}
return cacheKey;
}
private String bytesToHexString(byte[] bytes) {
StringBuilder sb = new StringBuilder();
for (int i = 0; i < bytes.length; i++) {
String hex = Integer.toHexString(0xFF & bytes[i]);
if (hex.length() == 1) {
sb.append('0');
}
sb.append(hex);
}
return sb.toString();
}
}
相信看過我上一篇文章的,應該對這段代碼很熟悉了,這裡就不說了, 當然讀者可以自己擴展,把DisLruCache也加入進去,多一層文件緩存,接下來看Volley提供的另外一個加載圖片類NetworkImageView,這個類繼承於ImageView,是一個控件,所以在使用的時候先寫在布局文件中:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:Android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.fq.volleytest.MainActivity">
<com.android.volley.toolbox.NetworkImageView
android:id="@+id/network_image"
android:layout_width="100dp"
android:layout_height="100dp"
/>
</RelativeLayout>
NetworkImageView networkImageView;
networkImageView = (networkImageView)findViewById(R.id.network_image);
RequestQueue requestQueue1 = Volley.newRequestQueue(this);
ImageLoader imageLoader = new ImageLoader(requestQueue1, new BitmapCache());
networkImageView.setDefaultImageResId(R.drawable.default_image);
networkImageView.setErrorImageResId(R.drawable.failed_image);
networkImageView.setImageUrl("網絡圖片地址",imageLoader);
這個類也是依賴於ImageLoader,所以要先定義一個ImageLoader,只是不需要ImageListener了,因為NetworkImageView 可以自己設定默認圖片,和失敗的圖片,最後調用setImageUrl加載網絡圖片,好了,Volley加載網絡圖片就介紹到這裡,如有問題,歡迎指正,謝謝。
更多Android相關信息見Android 專題頁面 http://www.linuxidc.com/topicnews.aspx?tid=11