初识Volley(二)

Volley提供2个静态方法:
public static RequestQueue newRequestQueue(Context context) {}
public static RequestQueue newRequestQueue(Context context, HttpStack stack) {}

第一个直接调用第二个的newRequestQueue(context, null);方法,返回都是一个RequestQueue 对象

以ImageLoader为例 构造方法
 
public ImageLoader(RequestQueue queue, ImageCache imageCache) {
        mRequestQueue = queue;
        mCache = imageCache;
    }

需要一个RequestQueue 对象 和一个ImageCache对象 ,RequestQueue 可以通过Volley类中的静态方法newRequestQueue(Context context) 获得,而ImageCache 则是一个interface 
   
 public interface ImageCache {
        public Bitmap getBitmap(String url);
        public void putBitmap(String url, Bitmap bitmap);
    }
实现此接口,即上一文章中Cache包下的BitmapCache,赋值给mCache对象
mCache中缓存key value,key规则为String key = "#W"+maxWidth+"#H"+ maxHeight +url;

再来看下面方法
参数:defaultImageResId:未开始下载显示的图片Id,如果传递0则不显示任何东西
           errorImageResId:下载显示的图片Id,如果传递0则不显示任何东西
返回值:ImageListener
public static ImageListener getImageListener(final ImageView view,
            final int defaultImageResId, final int errorImageResId) {
        ...
        ...//直接new一个ImageListener
@Override public void onResponse(ImageContainer response, boolean isImmediate) 
{ if (response.getBitmap() != null) 
{ //response有值设置ImageView显示图片 
view.setImageBitmap(response.getBitmap()); } else if (defaultImageResId != 0) { view.setImageResource(defaultImageResId); } } }
	
response.getBitmap()中的bitmap是通过BatchedImageRequest中的batchResponse(),
通过一个ImageContainer类中的Interface:ImageListerner.onResponse回调回来的
private void batchResponse(String cacheKey, BatchedImageRequest request,
            final VolleyError error) {
        mBatchedResponses.put(cacheKey, request);
        // If we don't already have a batch delivery runnable in flight, make a new one.
        // Note that this will be used to deliver responses to all callers in mBatchedResponses.
        if (mRunnable == null) {
            mRunnable = new Runnable() {
                @Override
                public void run() {
                    for (BatchedImageRequest bir : mBatchedResponses.values()) {
                        for (ImageContainer container : bir.mContainers) {
                            if (container.mListener == null) {
                                continue;
                            }
                            if (error == null) {
                                //取得数据
                                container.mBitmap = bir.mResponseBitmap;
                                //通过ImageContainer中的mListener,即ImageListener中的onResponse()方法回调
                                container.mListener.onResponse(container, false);
                            } else {
                                container.mListener.onErrorResponse(error);
                            }
                        }
                    }
                    mBatchedResponses.clear();
                    mRunnable = null;
                }

            };
            // Post the runnable.
            mHandler.postDelayed(mRunnable, mBatchResponseDelayMs);
        }
    }



 

posted @ 2013-06-07 20:57  jlins  阅读(387)  评论(0编辑  收藏  举报