Volley的简单使用与介绍

本文深入探讨了Volley框架的出现背景、优点、功能及使用方法,包括JSON、图像等异步下载、网络请求的排序与优先级处理、缓存机制、与Activity生命周期的联动等特性,并详细介绍了如何使用Volley进行网络请求,如使用StringRequest、Post方式发送带参数请求、JsonRequest的使用以及ImageRequest加载图片的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Volley 简介

出现背景:

Android系统中主要提供了两种HTTP通信,HttpURLConnection HttpClient 几乎所有的代码中都可以见到这两个类的身影,使用率非常高,不过HttpURLConnectionHttpClient的用法较为复杂, Android开发团队也意识到要将HTTP的通信再进行简化,于是在2013Google I/O大会上推出了一个新的网络通信框架------volley

Volley优缺点:

Volley除了简单易用之外,在性能方面也进行了大幅度的调整,它的设计目标就是非常适合进行数据量不大的网络操作,而对于大数据量的网络操作, 比如说下载文件等,Volley表现非常糟糕。

Volley功能:

JSON,图像等的异步下载。

网络请求的排序。

网络请求的优先级处理。

缓存。

多级别取笑请求。

Activity的生命周期的联动,(Activity结束同时取笑所有的网络请求)。 

使用Volley的时候要下载其jar包,导入工程内方可使用。

StringRequest 使用

RequestQueue 是一个请求队列,它可以缓存所有的HTTP请求,然后按照一定的算法并发的发出请求,RequestQueue内部的设计就是非常适合高并发的,因此不必为每一次HTTP请求都来创建一个RequestQueue对象,这非常耗费资源,基本上每一个需要和网络交互的Activity中创建一个RequestQueue对象就足够了。

因此首先得生命一个RequestQueue对象:

RequestQueue queue = null;

OnCreate 初始化queue 

queue = Volley.newRequestQueue(this);

要发出一条响应的字符串HTTP请求,需要创建一个StringRequest 对象:

 String url = "http://www.baidu.com";
    //创建一个字符串请求(请求方式,地址, 响应的回调接口, 错误的回调接口)
    StringRequest request = new StringRequest(Request.Method.GET
            , url, new Response.Listener<String>() {
        @Override
        public void onResponse(String s) { // 成功返回的对象
            System.out.println(s);
        }
    }, new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError volleyError) { // 错误时返回的对象
            System.out.println(volleyError);
        }
    });
    queue.add(request);// 将请求添加到请求队列中
}

注意:

StringRequest

需要传递三个参数分别是:目标服务器的地址, 服务器响应成功的返回值, 服务器响应失败的值。 在模拟器上运行的时候,需要添加访问网络权限。

---------------------------------------------------------------------------------------------------------------------------------

使用Post方式发送带参数的请求。需要实现getParams()方法。

如下:

{

String url = "http://192.168.xx.x:8080/HelloServlet/LoginServlet";
StringRequest request = new StringRequest(Request.Method.POST, url, new Response.Listener<String>() {
    @Override
    public void onResponse(String s) {
        System.out.println("s=" + s);
    }
}, new Response.ErrorListener() {
    @Override
    public void onErrorResponse(VolleyError volleyError) {
        System.out.println(volleyError);
    }
}) {
    @Override
    protected Map<String, String> getParams() throws AuthFailureError {
        Map<String, String> params = new HashMap<>();
        params.put("username", "wang");
        params.put("password", "1234");
        return params;
    }
};
queue.add(request);

}

实现protected Map<String, String> getParams() 方法,将想要向服务器发送的数据,添加保存到一个HasMap中,然后返回。添加请求到请求队列中,此时带有参数的post请求会向服务器发送请求,服务器接收到请求后会做出相应的响应。

注意上面的url是自己写的一个本地服务器的地址, 模拟用户登录的一个场景。

JsonRequest 的使用:

类似于StringRequest JsonRequest也继承自Request JsonRequest是一个抽象类,JsonRequest 有两个直接子类,JsonObjectRequestJsonArrayRequest

实例如下:

String url = "http://weather.123.duba.net/static/weather_info/101110101.html?v=20146216";
    // 参数(请求方式,URL,请求方式,响应的回调接口,错误的回调接口)
   {

 

JsonObjectRequest request = new JsonObjectRequest(
            Request.Method.POST, url, null, new Response.Listener<JSONObject>() {
        @Override
        public void onResponse(JSONObject jsonObject) {
            System.out.println(jsonObject);
        }
    }, new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError volleyError) {
            System.out.println(volleyError);
        }
    }
    );
    queue.add(request);
}

在使用JsonObject的时候,也可以传递参数,数据将以JSON的数据个事故发出,在方法内将数据封装为JSON 如下:

String url = "http://192.168.56.1:8080/HelloServlet/LoginServlet";
   JSONObject jsonObject= new JSONObject();
    jsonObject.put("username","wang");
    jsonObject.put("password","1234");

然后将参数项中的null改为json对象。既可向服务器发送数据。

ImageRequest 的使用

使用ImageRequest可以从互联网上获取一张图片,简单易用

{

String url = "http://img2.imgtn.bdimg.com/it/u=3745428640,438000328&fm=21&gp=0.jpg";
  ImageRequest request = new ImageRequest(url, new Response.Listener<Bitmap>() {
      @Override
      public void onResponse(Bitmap bitmap) {
           imageView.setImageBitmap(bitmap);
      }
  }, 200, 200, Bitmap.Config.RGB_565, new Response.ErrorListener() {
      @Override
      public void onErrorResponse(VolleyError volleyError) {
          System.out.println(volleyError);
      }
  });
       queue.add(request);

}

ImageRequest的构造函数接收六个参数,

第一个为图片的URL地址,

第二个参数为图片请求成功后的回调,返回的是一个Bitmap 可以直接设置到ImageView中。

第三,四个参数为指定允许图片的高度与宽度。如果指定的网络图片的宽度和高度大于这里的最大值,则会进行压缩。

第五个参数为图片的颜色属性,

第六个参数是图片请求失败的回调,当请求失败的时候在IMageView中显示一张默认图片。

===========================================================================

ImageLoader 的使用:

ImageLoader也可以用来加载网络上的图片,其内部是使用ImageRequest实现的,不过

ImageLoader明显要比ImageRequest更加高效,因为它不仅可以图片进行缓存(如列表中的图片只需要加载一次就可以了),还可以过滤掉重复的连接,避免重复发送请求,

在使用ImageLoader的时候,需要自己定缓存的大小,

(带有缓存的)代码入下:

public void ImageLoader_Click (View  view){
       String url = "http://img2.imgtn.bdimg.com/it/u=3745428640,438000328&fm=21&gp=0.jpg";
       ImageLoader imageLoader = new ImageLoader(queue,new BitmapCache() );
    // 获取一个图片监听器
    ImageLoader.ImageListener listener=ImageLoader.getImageListener(imageView, R.mipmap.ic_launcher, R.mipmap.ic_launcher);
  imageLoader.get(url,listener,200,200);
}
// 用于图片缓存
private class BitmapCache implements ImageLoader.ImageCache{
    private LruCache<String,Bitmap> cache;//android提供的缓存工具
      private int maxCache =10*1024 ;
    public BitmapCache(){
       cache= new LruCache<>(maxCache);
    }
    @Override
    // 得到缓存
    public Bitmap getBitmap(String s) {
        return cache.get(s);
    }
    @Override
    //将图片放入缓存
    public void putBitmap(String s, Bitmap bitmap) {
      cache.put(s,bitmap);
    }
}

===========================================================================

NetWorkImageView加载图片

NetWorkImageView不同于以上两种方式,NetWorkImageView是一个自定义控制,它是继承自ImageView的,具备ImageView控件的所有功能,并且在原生的基础上加载网络图片的功能,NetWorkImageView控件用法要比前两种更加简单。

实例如下:

private void networkImageViews() {
    String url = "http://img2.imgtn.bdimg.com/it/u=3745428640,438000328&fm=21&gp=0.jpg";
    ImageLoader imageLoader = new ImageLoader(queue,new BitmapCache());
    // 获取一个图片监听器
    ImageLoader.ImageListener listener=ImageLoader.getImageListener(imageView, R.mipmap.ic_launcher, R.mipmap.ic_launcher);
    imageLoader.get(url, listener, 200, 200);
    networkImageView.setImageUrl(url,imageLoader);
}

NetWorkImageView在加载图片的时候会自动获取自身的宽高,然后对比网络图片的宽高,在决定是否对图片进行压缩,压缩也是完全自动化,NetWorkImageView会始终呈现给我们一张大小刚刚好的网络图片,不会多占用一点内存,这也是NetWorkImageView最简单好用的一点。

如果不想对图片进行压缩,只需在布局文件中吧NetWorkImageView的长宽设定为内容自适应即可,这样就会显示原始的大小。

 

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值