您的位置:首页 > 理论基础 > 计算机网络

Volley 网络框架异步加载入门

2017-08-03 15:09 267 查看
开发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)说白了就是接口网址
* J
a1d4
SONObject 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);


总结:主要分析了两种POST请求的用法,具体根据后台定夺,如果后台需求的参数是普通的String,我们只需要用Map存储起来然后用StringBuilder拼接就行了,然后重写getBody(),return这个StringBuilder的字符串(记得转换为UTF-8的格式);如果后台需求的是Json格式那么我们就把Map转换一下,然后把这个转出的JSONObject当做第三个参数传入JsonObjectRequest请求就OK了。
一种是JsonObjectRequest,一种是StringRequest,可以根据POST请求的用法灵活使用。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: