Volley之ImageLoader用法解析

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();

希望对大家有帮助。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值