Volley笔记--基本使用

作者: MinuitZ | 来源:发表于2017-07-26 13:34 被阅读12次

    Volley简介###

    在实习期间, 公司经常会用到频繁但数据量较小的网络通信, 这时候我忽然想起了在大三期间接触到的一个网络请求框架(当时只是来加载图片来着, 而且现在使用的也不是Volley), 所以今天再拿出来整理一下.

    优点#####
    • 非常适合进行数据量不大,但通信频繁的网络操作
    • 可直接在主线程调用服务端并处理返回结果
    • 可以取消请求,容易扩展,面向接口编程
    • 网络请求线程NetworkDispatcher默认开启了4个,可以优化,通过手机CPU数量
    • 通过使用标准的HTTP缓存机制保持磁盘和内存响应的一致
    缺点#####
    • 使用的是httpclient、HttpURLConnection
    • 6.0不支持httpclient了,如果想支持得添加org.apache.http.legacy.jar
    • 对大文件下载 Volley的表现非常糟糕
    • 只支持http请求
    • 图片加载性能一般

    概述###

    Volley的请求方法都是大同小异, 分为三个步骤
    1. 创建请求队列
    RequestQueue requestQueue = Volley.newRequestQueue(this);
    在这里我们不需要为每一次的请求创建队列, 只需要在一个Activity初始化的时候生成队列, 在需要网络交互的时候, 加入请求就可以了.
    2. 创建请求
    3. 将请求添加到队列中

    以下是几个请求的例子:

    GET 请求####

        // 1. 创建请求队列
        RequestQueue requestQueue = Volley.newRequestQueue(this);
        // 2. 添加一个请求
        StringRequest stringRequest = new StringRequest(url,
                new Response.Listener<String>() {
                    @Override
                    public void onResponse(String response) {
                        //获取到网络数据的监听
                        Log.e(TAG, "onResponse: "+response );
                    }
                },
                new Response.ErrorListener() {
                    @Override
                    public void onErrorResponse(VolleyError error) {
                        //发生异常的监听
                        Log.e(TAG, "onErrorResponse: "+error.toString() );
                    }
                });
        // 3. 将创建的请求加入请求队列
        requestQueue.add(stringRequest);
    

    POST请求####

    在POST请求中, 必须将第一个请求的第一个参数指定为Request.Method.POST, 并在构造函数中,重写getParams方法.

        // 1. 创建请求队列
        RequestQueue requestQueue = Volley.newRequestQueue(this);
        // 2. 创建post请求
        StringRequest request = new StringRequest(
                Request.Method.POST,
                url,
                new Response.Listener<String>() {
                    @Override
                    public void onResponse(String response) {
                        //获取到数据
                        Log.e(TAG, "onResponse: "+response );
                    }
                }
                ,
                new Response.ErrorListener() {
                    @Override
                    public void onErrorResponse(VolleyError error) {
                        //发生异常
                        Log.e(TAG, "onErrorResponse: "+error.toString() );
                    }
                }
        ){
            @Override
            protected Map<String, String> getParams() throws AuthFailureError {
                // 在此处添加Post请求使用的参数
                Map map=new HashMap<String, String>();
                map.put("value1","value1");
    
                return map;
            }
        };
        // 3. 将post请求添加到队列
        requestQueue.add(request);
    

    请求JSON数据####

        // 1. 创建请求队列
        RequestQueue requestQueue = Volley.newRequestQueue(this);
        // 2. 创建JsonObject请求
        JsonObjectRequest request = new JsonObjectRequest(url,
                null,
                new Response.Listener<JSONObject>() {
                    @Override
                    public void onResponse(JSONObject response) {
                        //请求成功,返回json数据
                    }
                },
                new Response.ErrorListener() {
                    @Override
                    public void onErrorResponse(VolleyError error) {
                        //请求失败
                    }
                });
    
        // 3. 将请求加入队列
        requestQueue.add(request);
    

    Volley请求图片###

    使用ImageRequest请求图片####

        // 1. 创建请求队列
        RequestQueue requestQueue = Volley.newRequestQueue(this);
        // 2. 创建图片请求
        ImageRequest request = new ImageRequest(
                url,
                new Response.Listener<Bitmap>() {
                    @Override
                    public void onResponse(Bitmap response) {
                        //成功获取图片
                    }
                },
                300,  //0 表示不对图片最大宽高进行处理
                300,
                ImageView.ScaleType.FIT_XY, Bitmap.Config.RGB_565,
                new Response.ErrorListener() {
                    @Override
                    public void onErrorResponse(VolleyError error) {
    
                    }
                });
        // 3. 将请求加入请求队列
        requestQueue.add(request);
    

    ImageLoader的用法####

    • 绝对不要因为"会"而停止学习, 谁知道你学到的下一个会更好用呢
      ImageLoader也可以用于加载网络上的图片,并且它的内部也是使用ImageRequest来实现的,不过ImageLoader明显要比ImageRequest更加高效,因为它不仅可以帮我们对图片进行缓存,还可以过滤掉重复的链接,避免重复发送请求。

    • 使用步骤

    1. 创建一个RequestQueue对象。(不啰嗦了)

    2. 创建一个ImageLoader对象。
      ImageLoader imageLoader = new ImageLoader(mQueue,
      new ImageCache() { //第二个参数为图片缓存
      @Override
      public void putBitmap(String url, Bitmap bitmap) {
      }

        @Override  
        public Bitmap getBitmap(String url) {  
          return null;  
        }  
        });  
      
    3. 获取一个ImageListener对象。
      ImageListener listener = ImageLoader.getImageListener(imageView,
      R.drawable.default_image, R.drawable.failed_image);

    4. 调用ImageLoader的get()方法加载网络上的图片。
      imageLoader.get("http://img.my.csdn.net/uploads/201404/13/1397393290_5765.jpeg", listener,200,200);
      第三个和第四个参数为限制图片的最大宽度和高度,也可以不写,默认加载原图

    基本使用是结束了, 但是 ,我们还没有用它的缓存, 这里我们新建一个类用来缓存图片,设置默认的最大值为6M
    public class BitmapCache implements ImageCache {

        private LruCache<String, Bitmap> mCache;  
      
        public BitmapCache() {  
            int maxSize = 6 * 1024 * 1024;  
            mCache = 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 mCache.get(url);  
        }  
      
        @Override  
        public void putBitmap(String url, Bitmap bitmap) {  
            mCache.put(url, bitmap);  
        } 
    }  
    

    接下来我们修改第二步, 这样就可以使用缓存了.
    ImageLoader imageLoader = new ImageLoader(mQueue,new BitmapCache ());

    NetworkImageView####

    NetworkImageView是一个自定义控制,它是继承自ImageView的,具备ImageView控件的所有功能,并且在原生的基础之上加入了加载网络图片的功能。NetworkImageView控件的用法要比前两种方式更加简单,大致可以分为以下五步:

    1. 创建一个RequestQueue对象。(相信这句话大家看的都不想看了)
    2. 创建一个ImageLoader对象。
    3. 在布局文件中添加一个NetworkImageView控件。
      <com.android.volley.toolbox.NetworkImageView />
      在布局文件中就可以限制图片的大小, 自动压缩. 如果不想压缩的话, 宽高设置为wrap_content就好
    4. 在代码中获取该控件的实例。
      networkImageView = (NetworkImageView) findViewById(R.id.network_image_view);
    5. 设置要加载的图片地址。
      networkImageView.setDefaultImageResId(R.drawable.default_image); //设置加载中的图片(默认图片)
      networkImageView.setErrorImageResId(R.drawable.failed_image); // 设置加载失败时的图片
      networkImageView.setImageUrl("http://img.my.csdn.net/uploads/201404/13/1397393290_5765.jpeg",
      imageLoader);

    相关文章

      网友评论

        本文标题:Volley笔记--基本使用

        本文链接:https://www.haomeiwen.com/subject/hnkgkxtx.html