Android网络通信框架Volley使用技巧汇总(一)

来源:互联网 发布:unity3d encodetojpg 编辑:程序博客网 时间:2024/05/17 20:44

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>() {@Overridepublic void onResponse(String response) {// TODO Auto-generated method stub}}, new Response.ErrorListener() {@Overridepublic void onErrorResponse(VolleyError arg0) {}}) {// 如何解析服务端设置的cookie@Overrideprotected 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>() {@Overridepublic void onResponse(String response) {}, new Response.ErrorListener() {@Overridepublic void onErrorResponse(VolleyError arg0) {}) {// 如何上传cookie@Overridepublic 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使用技巧汇总(二). ^_^





0 0