开发android应用很多时候都要涉及网络操作,Android SDK中提供了HttpClient 和 HttpUrlConnection两种方式用来处理网络操作,但当应用比较复杂的时候需要我们编写大量的代码处理很多东西:图像缓存,请求的调度等等;
而Volley框架就是为解决这些而生的,它与2013年Google I/O大会上被提出:使得Android应用网络操作更方便更快捷;抽象了底层Http Client等实现的细节,让开发者更专注与产生RESTful Request。另外,Volley在不同的线程上异步执行所有请求而避免了阻塞主线程。
首先我们需要依赖Volley:
我们在build.gradle添加此依赖:
compile 'com.mcxiaoke.volley:library:1.0.19'
然后直接上一波带注释的代码:
// new 一个请求的队列
RequestQueue mQueue = Volley.newRequestQueue(getApplicationContext());
/**
* int method RESTFul风格 常用的有Request.Method.GET,Request.Method.POST,Request.Method.DELETE等方法,看接口需要
* String url 统一资源定位符(Uniform Resource Locator)说白了就是接口网址
* Listener<String> listener 请求成功回调的接口
* ErrorListener errorListener 请求失败回调的接口
*/
StringRequest mStringRequest = new StringRequest(Request.Method.POST
, "https://qa-api.zixuangu8.com/my-followings"
, new Response.Listener<String>() {
@Override
public void onResponse(String response) {
Log.d("devil", "成功" + response);
}
}
, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Log.e("devil", error.getMessage(), error);
}
}) {
@Override
public byte[] getBody() throws AuthFailureError {
Map<String, String> map = new HashMap<String, String>();
map.put("_token", "6be13c5e-d583-498c-a6fb-b7813bb2ea4f");
map.put("userId", "551aaa95-75c5-479b-a11c-5898a5cebb41");
StringBuilder sb = new StringBuilder();
for (Map.Entry<String, String> entry : map.entrySet()) {
sb.append(entry.getKey());
sb.append("=");
sb.append(entry.getValue());
sb.append("&");
}
try {
return sb.substring(0, sb.length() - 1).toString().getBytes("UTF-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return null;
}
};
//将请求添加在请求队列中
mQueue.add(mStringRequest);
因为是异步加载,所以不需要另外开线程,可以在主线程直接调用。
以上这种是Post请求带的参数是以普通字符串形式传递给后台的,下面有种后台接受Json字符串的请求方式,我们先添加一个依赖,便于我们转换Json格式:
compile 'com.google.code.gson:gson:2.8.1'
博主特意叫朋友给了个post请求后台接受参数为Json的接口(博主公司后台接受的就是普通的字符串,并不是Json格式的,当然此框架是为了更好的了解网络请求,现在的公司基本都是Retorfit + RxJava)下面上代码:
// 返回是Json Volley异步请求
Map<String, String> map = new HashMap<String, String>();
map.put("memberId", "93381e72855045609e2fbbdfb61ea23d");
JSONObject paramJsonObject = new JSONObject(map);
// paramJsonObject:{"memberId":"93381e72855045609e2fbbdfb61ea23d"}
// new 一个请求的队列
RequestQueue mQueue = Volley.newRequestQueue(getApplicationContext());
/* int method RESTFul风格 常用的有Request.Method.GET,Request.Method.POST,Request.Method.DELETE等方法,看接口需要
* String url 统一资源定位符(Uniform Resource Locator)说白了就是接口网址
* JSONObject jsonRequest 被封装成Json的请求体
* Listener<String> listener 请求成功回调的接口
* ErrorListener errorListener 请求失败回调的接口
*/
JsonObjectRequest mJsonObjectRequest = new JsonObjectRequest(Request.Method.POST
, "http://60.173.235.235:9898/ykds-admin/api/mall/getUserData"
, paramJsonObject
, new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
Log.d("devil", "成功" + response);
// 注意可以直接在加载UI并不需要重新调用UI线程,是不是特别方便
Toast.makeText(SecondActivity.this, "success", Toast.LENGTH_SHORT).show();
}
}
, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Log.e("devil", error.getMessage(), error);
}
}
);
Log.e("devil", "怪兽" + mJsonObjectRequest.toString());
mQueue.add(mJsonObjectRequest);
以上这种形式是以后台接受Json格式参数为例,细心的小伙伴可能发现了JsonObjectRequest接收了5个参数,为什么是5个,第三个参数是我们转换的Json格式的参数,源码中有一句对第三个参数的判断:
jsonRequest == null ? Method.GET : Method.POST
我们可以发现当第三个参数为空时,底层默认调用了GET请求,最后我们贴一个最简单的GET请求的样式吧:
//创建请求队列返回是String
RequestQueue mQueue = Volley.newRequestQueue(getApplicationContext());
StringRequest mStringRequest = new StringRequest(Request.Method.GET, "https://qa-api.zixuangu8.com/my-favorite-communities?_token=88b08891-173f-4d6e-927d-278f0e23d2ea",
new Response.Listener<String>() {
@Override
public void onResponse(String response) {
Log.d("devil", b.getMsg());
}
},
new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Log.e("devil", error.getMessage(), error);
}
});
//将请求添加在请求队列中
mQueue.add(mStringRequest);
一种是JsonObjectRequest,一种是StringRequest,可以根据POST请求的用法灵活使用。