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