zoukankan      html  css  js  c++  java
  • Android 网络通信框架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);
            }
        }
  • 相关阅读:
    jquery的ztree操作
    原创-使用pywinauto和swapy-ob-0.4.3进行dotnet的winform程序控制(二)
    原创-使用pywinauto进行dotnet的winform程序控制(一)
    javascript“命名空间”的费曼输出[原创]
    IIS7上传4M文件以上文件出现“Post大小超出允许的限制”错误解决方法
    OpenProj打开不了或者提示”Failed to load Java VM Library”的错误的解决方案
    项目管理中,开始到完成、完成到开始、开始到开始、和完成到完成的关系图解
    我的项目管理之干系人分析在单位项目中的运用
    关于学习js的Promise的心得体会
    vue.js与后台模板引擎“双花括号”冲突时的解决办法
  • 原文地址:https://www.cnblogs.com/android-zcq/p/3183444.html
Copyright © 2011-2022 走看看