Volley是Ficus Kirpatrick在Gooogle I/O 2013发布的一个处理和缓存网络请求的库,能使网络通信更快,更简单,更健壮。volley适合小而快的数据传输,使用volley非常简单方便,而且可以自定义请求。遗憾的是volley并不提供使用文档(可能开发者觉得简单易用。。)但是随着使用者越来越多,volley的资料也就越来越多,作为一个Android开发新手,我总结了不少volley使用的技巧,希望能供大家借鉴并应用到项目中去。
一.简单的Volley请求获取Json数据
首先我们来熟悉一下最简单的Volley请求,使用volley请求服务器上的Json数据,先来看看代码,注释的很清楚,应该不难理解:
public void getJsonByVolley(){ //新建一个Volley请求队列,在方法最后用于将我们的Volley请求添加进去 RequestQueue requestQueue = Volley.newRequestQueue(this); //我们的请求链接 String httpurl = "http://172.18.10.8:8080/CardServer/ws/stores"; //Volley方法JsonRequest 用于请求Json数据,也可以带Json参数提交服务器, JsonRequest<JSONObject> jsonRequest = new JsonObjectRequest(Method.POST,httpurl, null, new Response.Listener<JSONObject>() { //请求成功的监听方法 @Override public void onResponse(JSONObject response) { Log.d(TAG, "response-------- " + response.toString()); } }, new Response.ErrorListener() { //请求失败的监听方法,在请求状态不是200的情况下,都会是ErrorListener来处理 @Override public void onErrorResponse(VolleyError error) { Log.d(TAG,"error-------- "+ error); } }); //把请求添加到请求队列中去 requestQueue.add(jsonRequest); }
我们可以简单的认为,volley仅仅使用一个方法就可以实现我们需要的网络通信:
JsonRequest<JSONObject> quest = new JsonObjectRequest(method,url,jsonRequest,listener,errorListener);
其中第一个method,是设置我们的请求方式,可以使Method.POST,也可以是Method.GET
第二个参数url,就是我们要请求的请求地址
第三个参数JsonRequest可以是null,也可以是一个JsonObject,是我们可以带上JsonObject请求服务器
第四个参数Listener就是我们请求成功的监听方法,发送handler,或者直接操作UI都可以。
第五个参数errorListener就是在请求失败的情况下我们的监听方法,在这里也可以操作UI,后续关于这些的使用方法我都会一一总结出来。
二.带表单参数提交到服务器上
在实际开发中免除不了我们需要带参数到服务器上,当需要带参数的时候,我们可以通过重写public Map<String, String> getParams() {}方法 将参数传入Map里,这样Volley在处理请求的时候会自动带入Map参数,下面我使用一个开发中使用的实际案例,把意见反馈传入服务器,代码和注释如下:
public void newfeedback(){ String httpurl = "http://172.18.10.88:8080/CardServer/ws/feedback/createFeedback"; RequestQueue requestQueue = Volley.newRequestQueue(this); StringRequest stringRequest = new StringRequest(Request.Method.POST,httpurl, new Response.Listener<String>() { @Override public void onResponse(String response) { Log.d(TAG, "response ->------------- " + response); } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { Log.d(TAG, "----------------"+error); } }) { @Override public Map<String, String> getParams() { //在这里设置需要post的参数 Map<String, String> map = new HashMap<String, String>(); map.put("userId", "1111"); map.put("title", "我觉得这个APP很不好用"); map.put("feedbackContent", "改进改善!!!!"); return map ; } }; requestQueue.add(stringRequest); }
三.使用volley获取cookie.
在登陆注册的时候为了保证请求在同一个Session中,使用volley获取cookie,并取出sessionId,并在登陆请求的时候带上sessionId,我们可以重写protected Response<String> parseNetworkResponse(
NetworkResponse response) {}方法来获取cookie,代码如下:
/** * 获取cookie */ private void getTelVolleyMa() { RequestQueue requestQueue = Volley.newRequestQueue(this); String JSONDataUrl = CscTools.getWSUrl() + "users/sendCode?tel=" + phone_num; StringRequest stringrequest = new StringRequest(Request.Method.POST, JSONDataUrl, new Response.Listener<String>() { @Override public void onResponse(String response) { // TODO Auto-generated method stub } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError arg0) { } }) { // 如何解析服务端设置的cookie @Override protected Response<String> parseNetworkResponse( NetworkResponse response) { Response<String> superResponse = super .parseNetworkResponse(response); Map<String, String> responseHeaders = response.headers; String rawCookies = responseHeaders.get("Set-Cookie"); cookies = rawCookies.substring(0, rawCookies.indexOf(";")); // String cookies = part1; Log.d("sessionid", "sessionid----------------" + cookies); return superResponse; } }; requestQueue.add(stringrequest); }
其中cookies是一个全局变量
public static volatile String cookies;
在用户填写密码或者验证码之后,我们就可以通过下面这个方法把sessionId带到服务器上,通过重写getHeaders()方法,代码如下:
/** * 登陆验证 */ private void getTelVolley(final String isUrl) { RequestQueue requestQueue = Volley.newRequestQueue(this); Log.d("调试", "isUrl----------------" + isUrl); String JSONDataUrl = null; StringRequest stringrequest = new StringRequest(Request.Method.POST, JSONDataUrl, new Response.Listener<String>() { @Override public void onResponse(String response) { }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError arg0) { }) { // 如何上传cookie @Override public Map<String, String> getHeaders() throws AuthFailureError { if (cookies != null && cookies.length() > 0) { HashMap<String, String> headers = new HashMap<String, String>(); headers.put("cookie", cookies); Log.d("调试", "headers----------------" + headers); return headers; } return super.getHeaders(); } }; requestQueue.add(stringrequest); }
通过上面这两个请求,我们就可以完成一个登陆流程了,是不是觉得很简单呢,后面还有第二篇关于volley的使用总结,因为是使用技巧,所以就不符上源码了,相信使用过volley的同学都能看的懂吧,如果你觉得的博客不错,请继续看Android网络通信框架Volley使用技巧汇总(二).
^_^