Volley 简介
出现背景:
Android系统中主要提供了两种HTTP通信,HttpURLConnection 和HttpClient 几乎所有的代码中都可以见到这两个类的身影,使用率非常高,不过HttpURLConnection和HttpClient的用法较为复杂, Android开发团队也意识到要将HTTP的通信再进行简化,于是在2013年Google 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 有两个直接子类,JsonObjectRequest和JsonArrayRequest
实例如下:
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的长宽设定为内容自适应即可,这样就会显示原始的大小。