关键字: Volley
JsonObject
JsonArrayRequest
StringRequest
前言:这篇文章也是记录我在慕课网跟随
JVR
老师学习到有关Volley的知识。关于Volley的记录将分为两部分,分别记录“Volley网络数据请求的使用”和“使用Volley加载、缓存图片”。这篇文章是第一部分。
这里给出有关链接,方便大家访问。
慕课网:http://www.imooc.com/
JVR老师慕课网个人主页:http://www.imooc.com/space/teacher/id/2225574
正文:
Volley
的中文翻译为齐射、并发,是Google2013年io大会上发布的网络通讯库。
- 通信更快、更简单
- GET、POST网络请求及网络图像的高效率异步处理请求
- 对请求进行优先级的排序
- 网络请求的缓存
- 多级别取消请求
- 和Activity生命周期的联动
- 不太适合进行网络数据的上传和下载
- Volley提供了这么几个请求对象:
StringRequest
:返回的结果不确定时使用
JsonObjectRequest
:返回结果为JsonObject,直接使用该对象,方便封装数据
JsonArrayRequest
:返回结果为JsonArray,直接使用该对象,方便封装数据 - Volley提供了一些使用方便的回调方法:
onResponse
:在请求成功时调用
onErrorResponse
:在请求失败时调用 - 队列建立和取消队列请求
- 和Activity生命周期的联动
可以在Activity销毁的时候,关闭请求,一般是使用Tag
标签,在onStop()
里取消请求
Volley网络数据请求的使用
要使用 Volley,先要在项目中引入Volley库
在build.gradle
文件中添加Volley库,Android studio会自动下载。
dependencies {
compile 'com.mcxiaoke.volley:library:1.0.17'
}
1. 使用GET方式请求
//按钮的点击事件
public void click(View view) {
// 要访问的URL
String url="http://m.weather.com.cn/atad/101010100.html";
//Volley的请求队列
RequestQueue requestQueue = Volley.newRequestQueue(getApplicationContext());
//StringRequest实例
//第一个参数:请求方式GET、POST
//第二个参数:请求的URL
//第三个参数:请求成功的监听器,传递了请求结果
//第四个参数:请求失败的监听器,传递了失败的原因
StringRequest stringRequest = new StringRequest(Method.GET,
url, new Response.Listener<String>() {
@Override
public void onResponse(String response) {
//使用获取的数据更新UI
button.setText(response); }
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
button.setText(error.toString());
}
}) };
//设置该请求的Tag
stringRequest.setTag("StringGET");
//把该请求添加到requestQueue中
requestQueue.add(stringRequest);
//requestQueue.start();
}
如果使用JsonObjectRequest
请求对象,返回的response是JSONObject
对象,直接可以解析:
button.setText(response.getJSONObject("weatherinfo").get("city").toString());
JsonArrayRequest
请求对象类似。
2. 使用POST方式请求
有两种方法可以post参数。
- 通过重写请求对象的
getParams()
方法,该方法在post请求时,自动调用,获取请求参数。
JsonObjectRequest jsonObjectRequest = new JsonObjectRequest(Method.POST,
url, new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
}
}){
@Override
protected Map<String, String> getParams() throws AuthFailureError {
Map<String,String> map = new HashMap<>();
map.put("username","liming");
map.put("password", "123456");
return map;
}
};
- 如果是
JsonObjectRequest
还可以使用JsonObjectRequest
另一个构造方法实现参数的传递:
public void click(View view) {
String url = "http://m.weather.com.cn/atad/101010100.html";
RequestQueue requestQueue = Volley.newRequestQueue(getApplicationContext());
//封装请求参数
Map<String, String>map = new HashMap<>();
map.put("username","liming");
map.put("password","123456");
JSONObject jsonObject = new JSONObject(map);
//参数jsonObject封装了请求参数,Volley会自动提取里面的值,作为post请求参数
JsonObjectRequest jsonObjectRequest = new JsonObjectRequest(Method.POST,
url,jsonObject,
new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
//执行请求成功的逻辑
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
//执行请求失败的逻辑
}
});
jsonObjectRequest.setTag("jsonObjectGET");
requestQueue.add(jsonObjectRequest);
//requestQueue.start();}