1.Volley简介
Volley是在2013年Google I/O大会上推出的一个网络通信框架,能够让我们的网络请求变得更加容易和快速。
Volley具有以下优点:
-网络请求的自动调度
-多并发网络连接
-透明的磁盘缓存和内存缓存
-支持请求优先级
-有取消请求的接口,你可以取消一个请求,也可以设置请求取消的块或范围
-很容易定制,如重试,退避
-强大的排序,能够很容易的将从网络中异步请求的数据正确的显示在用户界面。
-具有调试和跟踪工具
Volley适用于通信比较频繁,但是数据量不大的网络请求,而对于数据量大的网络操作,如文件下载,流媒体等操作不适用。
2.Volley的使用
(1)获取Volley的支持
clone Volley的源码到你的电脑:
git clone https://android.googlesource.com/platform/frameworks/volley
将下载的Volley源码作为Android Library 导入到你的项目中。
(2)开始使用
-创建RequestQueue
首先需要创建一个RequestQueue请求队列对象,RequestQueue对象用来管理网络操作的工作线程,读取和写入缓存,解析响应。
我们不需要为每一次Http请求都创建一个RequestQeueue,基本上每一个需要和网络交互的Activtiy创建一个RequestQueue对象
就可以了。
RequestQueue requestQueue=Volley.newRequestQueue(context);
-创建Request请求对象
请求对象有StringRequest,JsonObjectRequest,JsonArrayRequest分别用于请求字符串数据,JSON对象数据,JSON数组数据。
这里以StringRequest为例,创建一个请求对象,以Get方式为例:
请求方式同样Get和Post两种,对应参数: Request.Method.Get 和 Request.Method.Post;
String url = "http://www.baidu.com";
StringRequest stringRequest = new StringRequest(Request.Method.GET, url, new Response.Listener<String>() {
@Override
public void onResponse(String s) {
Toast.makeText(MainActivity.this, s, Toast.LENGTH_SHORT).show();
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError volleyError) {
Log.i(TAG, volleyError.getMessage());
}
});
-将请求对象添加到请求队列RequesrQueue中
requestQueuee.add(stringRequest);
这样就完成了一个StringRequest的请求,请求成功会回调onResponse()方法,请求失败会回调onErrorResponse()方法。
这两个方法都是工作在主线程中,可以在这两个方法里直接对UI做更新。
上面由于使用的是Get请求,所以没有携带请求参数,如果是Post请求,需要携带请求参数,需要重写
StringRequest的getParams()方法,如下:
String url = "http://192.168.0.102:8080/HttpServer/TestServlet";
StringRequest stringRequest = new StringRequest(Request.Method.POST, url, listener, errorListener) {
@Override
protected Map<String, String> getParams() throws AuthFailureError {
Map<String, String> map = new HashMap<String, String>();
map.put("key", "value"); //携带的请求参数
return map;
}
};
requestQueue.add(stringRequest);
//为了代码的美观,listener和errorListener都在外面定义实现。
Response.Listener<String> listener = new Response.Listener<String>() {
@Override
public void onResponse(String s) {
Toast.makeText(MainActivity.this, s, Toast.LENGTH_SHORT).show();
}
};
Response.ErrorListener errorListener = new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError volleyError) {
Log.i(TAG, volleyError.getMessage());
}
};
这就是StringRequest的Post请求的实现。
-JsonRequest
介绍了StringRequest,再来介绍一下JsonRequest,请求的是Json数据,JsonRequest也是继承自Request的,不过JsonRequest是一个抽象类,我们使用的是它的两个实现类,JsonObjectRequest和JsonArrayRequest,
使用和StringRequest是相类似的,如下:
JsonObjectRequest jsonObjectRequest = new JsonObjectRequest(Request.Method.Get, url, null,
new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject jsonObject) {
Toast.makeText(MainActivity.this, jsonObject.toString(), Toast.LENGTH_SHORT).show();
}
},
new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError volleyError) {
Log.i(TAG, volleyError.getMessage());
}
}
);
requestQueue.add(jsonObjectRequest);
这个时候,服务器端返回的直接是一个JSONObject数据,服务器返回如下
PrintWriter out = response.getWriter();
JSONObject jsonObject = new JSONObject();
jsonObject.put("result", "欢迎访问服务器");
out.println(jsonObject);
out.flush();
out.close();
请求成功后onResponse()中Toast出 {“result”,”欢迎访问服务器”};
至于JsonArrayRequest的用法也是相类似的。