zoukankan      html  css  js  c++  java
  • volley全然解析

    一、volley是什么?

    1、简单介绍

      Volley是Goole在2013年Google I/O大会上推出了一个新的网络通信框架,它是开源的。从名字由来和配图中无数急促的火箭能够看出 Volley 的特点:特别适合数据量小。通信频繁的网络操作。(个人觉得 Android 应用中绝大多数的网络操作都属于这样的类型)。

      Volley载入图片实现了两级缓存(网络缓存、文件缓存)。没有实现内存的缓存。Volley已经把各种异步任务、图片採样都封装好了。内存缓存使用lrucache类实现。须要我们手动增加进去。

    没有使用软引用缓存。由于4.0之后的android系统已经不推荐使用软引用缓存了。

    2、volley的整体设计

    这里写图片描写叙述

    这里写图片描写叙述

    3、volley能够做什么

    JSON,图像等的异步下载;
    处理get、post等网络请求;
    网络请求的排序(scheduling);
    网络请求的优先级处理;
    缓存;
    多级别取消请求;
    和Activity和生命周期的联动(Activity结束时同一时候取消全部网络请求);
    等等。

    它的设计目标就是很适合去进行数据量不大,但通信频繁的网络操作,而对于大数据量的网络操作。比方说下载文件等,Volley的表现就会很糟糕。

    二、图片的三级缓存在volley中的实现

      事实上volley能够全然代替我们手写的三级缓存,由于google已经对volley进行了很好的封装,详细说明例如以下:

    1、volley的推荐使用方法-单例模式

      使用volley时,我们推荐把volley的使用封装成单例使用。在application中初始化它。详细代码例如以下:

    单例:

    package com.ht.xiangqu.util;
    
    import android.content.Context;
    import android.graphics.Bitmap;
    import android.support.v4.util.LruCache;
    
    import com.android.volley.RequestQueue;
    import com.android.volley.toolbox.ImageLoader;
    import com.android.volley.toolbox.Volley;
    
    /**
     * Created by annuo on 2015/6/16.
     */
    public class RequestManager {
        private static RequestManager ourInstance;
        private RequestQueue requestQueue;
        private ImageLoader imageLoader;
    
    
        public static RequestManager createInstance(Context context) {
            if (context != null) {
                if (ourInstance == null) {
                    ourInstance = new RequestManager(context);
                } else {
                    throw new IllegalArgumentException("Context must be set");
                }
            }
            return ourInstance;
        }
    
        public static RequestManager getInstance() {
            return ourInstance;
        }
    
        private RequestManager(Context context) {
            requestQueue = Volley.newRequestQueue(context);
            imageLoader = new ImageLoader(
                    requestQueue,
                    new ImageLoader.ImageCache() {
                        private LruCache<String, Bitmap> cache
                                = new LruCache<>(20);
                        @Override
                        public Bitmap getBitmap(String url) {
                            return cache.get(url);
                        }
    
                        @Override
                        public void putBitmap(String url, Bitmap bitmap) {
                            cache.put(url, bitmap);
                        }
                    }
            );
        }
    
        public RequestQueue getRequestQueue() {
            return requestQueue;
        }
    
    
        public ImageLoader getImageLoader() {
            return imageLoader;
        }
    
    }
    

    application:

    package com.ht.xiangqu.util;
    
    import android.app.Application;
    import android.util.Log;
    
    /**
     * Created by annuo on 2015/6/16.
     */
    public class MainApplation extends Application {
        @Override
        public void onCreate() {
            super.onCreate();
            RequestManager.createInstance(getApplicationContext());
            Log.d("nihao", "nihao");
        }
    }
    

    2、内存缓存

      仅仅有载入图片的时候才会有内存缓存,对于字符串一般都是之后文件缓存。

      google并没有自己主动的帮我们实现内存的缓存,须要我们自己手动增加进去。内存缓存在单例类中已经体现了(即LruCache),以后我们每次使用的时候都不必再增加内存缓存。LruCache这个类是Android3.1版本号中提供的。假设你是在更早的Android版本号中开发,则须要导入android-support-v4的jar包。

    3、文件缓存

      volley已经默认帮我们实现了文件的缓存。

    我们通过源码看一下:

        /**
         * Constructs a new ImageLoader.
         * @param queue The RequestQueue to use for making image requests.
         * @param imageCache The cache to use as an L1 cache.
         */
        public ImageLoader(RequestQueue queue, ImageCache imageCache) {
            mRequestQueue = queue;
            mCache = imageCache;
        }
    

      以上代码是imageloader中的一段代码,从中我们能够看到在构造imageloader时,我们已经默认的建立了一个L1级的缓存(文件缓存)。

    那volley缓存下来的文件究竟在哪呢?见下图:

    这里写图片描写叙述

      详细的位置就在如图所看到的的位置。即data/data/应用程序的包名/volley。假设没有改动volley的缓存位置。默认名字叫volley。

    4、图片的二次採样的问题

      事实上volley默认的已经帮我们做了图片的二次採样,仅仅是须要我们在进行请求的时候,多增加两个參数。我们一般都忽略了这个问题,最后导致的是不断的OOM。

        /**
         * 这是訪问网络图片的核心方法
         * @param requestUrl
         * @param imageListener
         * @param maxWidth
         * @param maxHeight
         * @return
         */
        public ImageContainer get(String requestUrl, ImageListener imageListener,
                int maxWidth, int maxHeight) {
    
            Request<?

    > newRequest = new ImageRequest(requestUrl, new Listener<Bitmap>() { @Override public void onResponse(Bitmap response) { onGetImageSuccess(cacheKey, response); } }, maxWidth, maxHeight, Config.RGB_565, new ErrorListener() { @Override public void onErrorResponse(VolleyError error) { onGetImageError(cacheKey, error); } }); mRequestQueue.add(newRequest); mInFlightRequests.put(cacheKey, new BatchedImageRequest(newRequest, imageContainer)); return imageContainer; }

      以上代码是imageloader的核心方法,当中有两个參数是maxWidth,maxHeight。我们一般都忽略了这两个參数。默认值是0和0,这样二次採样算法就不起作用了。我们得到的图片是从server1:1哪来的。可是一般我们设置了这两个參数。就能够得到我们希望的缩小比例的图片。这样就能够全然的避免OOM。

    三、volley的其它问题

    1、圆角图片的问题

        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) {
                        //在这里能够设置,假设想得到圆角图片的画,能够对bitmap进行加工,能够给imageview加一个
                        //额外的參数
                        view.setImageBitmap(response.getBitmap());
                    } else if (defaultImageResId != 0) {
                        view.setImageResource(defaultImageResId);
                    }
                }
            };
        }
    

    2、listview复用时,解决图片错位的问题

        /**
         * 使用此方法能够解决图片错乱问题
         * @param view
         * @param defaultImageResId
         * @param errorImageResId
         * @param url
         * @return
         */
        public static ImageListener getImageListener(
                final ImageView view,
                final int defaultImageResId,
                final int errorImageResId,
                final String url) {
            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) {
                        //在这里能够设置,假设想得到圆角图片的画,能够对bitmap进行加工,能够给imageview加一个
                        //额外的參数
                        String urlTag = (String) view.getTag();
                        if(urlTag!=null && urlTag.trim().equals(url)){
                            view.setImageBitmap(response.getBitmap());
                        }
                    } else if (defaultImageResId != 0) {
                        view.setImageResource(defaultImageResId);
                    }
                }
            };
        }
    

    四、volley的详细使用方法

      关于这块内容。网络上有许多的资料,总之volley使用起来很的简单。感兴趣的能够去网络上查找相关的资料进行学习。volley的载入速度绝对出乎你的意料。

    ——知道自己是谁。要什么。能跳多高。并且敢跳,并承受跳了可能失败的全部结果。

  • 相关阅读:
    Spring不再推荐使用字段注入
    谈谈Web安全色(web safe color)
    mybatis写mapper文件注意事项
    GitHub下载加速
    ssm项目 ajax发起post请求,控制台一直404
    第一篇随笔
    C语言编程练习64:还是畅通工程
    C语言编程练习63:完数
    C语言编程练习62:汉诺塔3
    C语言编程练习61:Tempter of the bone
  • 原文地址:https://www.cnblogs.com/wzzkaifa/p/7244574.html
Copyright © 2011-2022 走看看