1、目录
image.png2、简介
Android系统中主要提供了两种方式来进行HTTP通信:
HttpUrlConnection和HttpClient。
如果直接使用HttpUrlConnection和HttpClient进行网络请求还是比较复杂的,会产生不少重复代码,于是在2013年Google I/O大会上推出了一个新的网络通信框架——Volley。
- 优点:简单易用,在性能上有较大的提升,只适用于小数据量且网络操作频繁的场景。
- 缺点:在数据量较大的场景下,Volley性能较差。因为Request和Respone是把数据放在byte数组中,数据量大所占的内存也就比较大。
2、Volley的基本使用
使用Volley进行网络请求的步骤如下:
- 1、创建RequestQueue对象。
- 2、创建请求Request。
- 3、添加Request到RequestQueue中。
2.1、在Activity中创建RequestQueue
RequestQueue是一个请求队列对象,它缓存了所有的HTTP请求,然后按照一定的算法并发的发出这些请求。RequestQueue内部设计比较适合高并发,所以没必要每一个请求都创建一个RequestQueue,这样非常浪费资源,基本上每一个Activity创建一个RequestQueue即可,并且在页面关闭时还能取消当前页面中的所有请求。
代码如下:
queue = Volley.newRequestQueue(this);
2.2、创建Request并添加到请求队列中
这里先以StringRequest为例发送一个简单的请求
StringRequest stringRequest = new StringRequest("https://www.baidu.com", new Response.Listener<String>() {
@Override
public void onResponse(String s) {
Log.e(TAG,"结果:"+s);
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError volleyError) {
Log.e(TAG,"错误:"+volleyError.getMessage());
}
});
queue.add(stringRequest);
这里我们创建了一个StringRequest对象,StringRequest接收三个参数,第一个参数是目标服务器的URL地址,第二个参数是服务器响应成功的回调,第三个参数是服务器响应失败的回调。
然后将Request对象添加到RequestQueue中,这样就完成了一次网络请求。
不过大家都知道,网络请求的方式通常有POST和GET两种,上面我们没有指定请求方式,会默认以GET方法进行请求,如果我们需要指定为POST请求,该怎么办呢?那就要使用StringRequest的另一个构造函数了
public StringRequest(int method, String url, Listener<String> listener, ErrorListener errorListener)
其中method就是请求方式的参数,指定为Method.POST即可。但是如何提交请求参数呢?很遗憾StringRequest并没有提供相应的方法,但是当发送POST请求时Volley会调用StringRequest的父类--Request中的getParams()
方法来获取请求参数,在这里设置即可,代码如下:
StringRequest stringRequest = new StringRequest(Method.POST, url, listener, errorListener) {
@Override
protected Map<String, String> getParams() throws AuthFailureError {
Map<String, String> map = new HashMap<String, String>();
map.put("params1", "value1");
map.put("params2", "value2");
return map;
}
};
2.3、JsonRequest
学习完StringRequest的使用后,下面看下JsonRequest的用法。类似于StringRequest,JsonRequest也是继承自Request类的,不过JsonRequest是一个抽象类,这里可以使用其子类入手。JsonRequest有两个子类:JsonObjectRequest和JsonArrayRequest,从名字上你应该能就看出它们的区别了吧?一个是用于请求一段JSON数据的,一个是用于请求一段JSON数组的。
至于它们的用法也基本上没有什么特殊之处,先new出一个JsonObjectRequest对象,如下所示:
JsonObjectRequest jsonObjectRequest=new JsonObjectRequest(Request.Method.GET, "https://m.weather.com.cn/d/town/index?lat=39.99472&lon=116.45582&areaid=101010300", null
, new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject jsonObject) {
Log.e(TAG,"结果:"+jsonObject.toString());
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError volleyError) {
Log.e(TAG,"错误:"+volleyError.getMessage());
}
});
queue.add(jsonObjectRequest);
可以看出和StringRequest的使用并没有多少区别,到此为止Volley的基本使用就介绍完毕了。
网友评论