Volley之ImageLoader用法解析
本文章适合对Volley有一定了解的朋友。
Volley相关学习:http://blog.csdn.net/fengqiaoyebo2008/article/details/42963915
这儿是Volley之ImageLoader,所以项目中一定要导入Volley的第三方库,这个就不多介绍了,自己去GitHub上Down。
用法很简单,总结起来只有三步,第一步,生成ImageLoader对象;第二步,调用ImageLoader的get(String, ImageListener)方法,该方法会返回一个ImageContainer对象;第三步,调用第二步返回的ImageContainer对象的getBitmap()方法,就能到到我们请求的Bitmap。
下面简单介绍一下上述步骤中遇到的类和接口。
1、ImageLoader
ImageLoader是通过远程URL处理加载和缓存图片的工具类,简单来说,就是向远程服务器或者你本地缓存请求图片的辅助类。构造方法如下:
public ImageLoader(RequestQueue queue, ImageCache imageCache) {
mRequestQueue = queue;
mCache = imageCache;
}
RequestQueue是你应用程序中的请求队列,用于储存所有的请求。ImageCache是ImageLoader内置的接口,用于缓存所有请求到的Bitmap。
ImageLoader有三个重载的get()方法用于请求图片:
public ImageContainer get(String, final ImageListener);
public ImageContainer get(String, ImageListener,int, int);
public ImageContainer get(String, ImageListener,int, int, ScaleType);
这里我们只介绍第三个,具体实现如下:
public ImageContainer get(String requestUrl,
ImageListener imageListener, int maxWidth, int maxHeight,
ScaleType scaleType) {
throwIfNotOnMainThread();
final String cacheKey = getCacheKey(requestUrl,
maxWidth, maxHeight, scaleType);
Bitmap cachedBitmap = mCache.getBitmap(cacheKey);
if (cachedBitmap != null) {
ImageContainer container = new ImageContainer(
cachedBitmap, requestUrl, null, null);
imageListener.onResponse(container, true);
return container;
}
ImageContainer imageContainer = new ImageContainer(
null, requestUrl, cacheKey, imageListener);
imageListener.onResponse(imageContainer, true);
BatchedImageRequest request = mInFlightRequests.get(
cacheKey);
if (request != null) {
request.addContainer(imageContainer);
return imageContainer;
}
Request<Bitmap> newRequest = makeImageRequest(
requestUrl, maxWidth, maxHeight, scaleType, cacheKey);
mRequestQueue.add(newRequest);
mInFlightRequests.put(cacheKey,
new BatchedImageRequest(newRequest, imageContainer));
return imageContainer;
}
首先通过getCacheKey()得到cacheKey,通过cacheKey,在缓存的图片中寻找对应得Bitmap对象,如果该对象不为空,调用ImageListener的onResponse()方法,表示请求成功,生成对应的ImageContainer对象并返回。
2、ImageCache
ImageCache是ImageLoader内置的接口,用于缓存所有请求到的Bitmap。(这个接口是要自己实现的,推荐存储图片使用LruCache)接口源代码如下:
public interface ImageCache {
public Bitmap getBitmap(String url);
public void putBitmap(String url, Bitmap bitmap);
}
ImageCache 的简单实现如下:
public class LruImageCache implements ImageCache{
private LruCache<String, Bitmap> lruCache;
public LruImageCache() {
int maxSize = 10 * 1024 * 1024;
lruCache = new LruCache<String, Bitmap>(maxSize) {
@Override
protected int sizeOf(String key, Bitmap bitmap) {
return bitmap.getRowBytes() * bitmap.getHeight();
}
};
}
@Override
public Bitmap getBitmap(String url) {
return lruCache.get(url);
}
@Override
public void putBitmap(String url, Bitmap bitmap) {
lruCache.put(url, bitmap);
}
}
3、ImageListener
ImageListener是对图片请求响应处理的接口,也是ImageLoader内置的接口,源代码如下:
public interface ImageListener extends ErrorListener {
public void onResponse(ImageContainer response, boolean isImmediate);
}
我们一般使用ImageLoader内置的getImageListener(final ImageView view,
final int defaultImageResId, final int errorImageResId)方法来得到ImageListener的一个子类对象,代码如下:
public static ImageListener getImageListener(final ImageView view, final int defaultImageResId, final int errorImageResId) {
return new ImageListener() {
@Override
public void onErrorResponse(VolleyError error) {
if (errorImageResId != 0) {
view.setImageResource(errorImageResId);
}
}
@Override
public void onResponse(ImageContainer response, boolean isImmediate) {=
if (response.getBitmap() != null) {
view.setImageBitmap(response.getBitmap());
} else if (defaultImageResId != 0) {
view.setImageResource(defaultImageResId);
}
}
};
}
ImageView用于显示请求得到的Bitmap(如果请求成功)。这儿有两种情况,当请求失败时onErrorResponse()方法会被调用,如果errorImageResId != 0为true,ImageView会显示默认的请求失败ID对应的Drawable资源;当请求成功时onResponse()方法会被调用,首先判断收到的回复中有没有Bitmap对象,有的话ImageView显示,没有的话判断defaultImageResId != 0,如果为true,显示默认的请求成功的ID对应的Drawable资源。
4、ImageContainer
ImageContainer是ImageLoader内置的接口,用于存储图片请求的所有信息。
最后我们进行图片请求的具体操作,这儿直接贴上代码:
package com.grumoon.volleydemo.util;
import android.content.Context;
import com.android.volley.RequestQueue;
import com.android.volley.toolbox.Volley;
public class VolleyUtil {
private volatile static RequestQueue requestQueue;
/** 返回RequestQueue单例 **/
public static RequestQueue getQueue(Context context) {
if (requestQueue == null) {
synchronized (VolleyUtil.class) {
if (requestQueue == null) {
requestQueue = Volley.newRequestQueue(context.getApplicationContext());
}
}
}
return requestQueue;
}
}
ImageLoader imageLoader = new ImageLoader(
VolleyUtil.getQueue(context), new LruImageCache());
ImageView imageView = (ImageView)findViewById(R.id.img);
ImageListener listener = ImageLoader.getImageListener(imageView,
R.drawable.ic_empty, R.drawable.ic_empty);
ImageContainer container = imageLoader.get(
StringUtil.preUrl(imageUrl),listener);
Bitmap bitmap = container.getBitmap();
希望对大家有帮助。