现在的位置: 首页 > 综合 > 正文

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

2018年03月31日 ⁄ 综合 ⁄ 共 4358字 ⁄ 字号 评论关闭

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使用技巧汇总(二).
^_^

抱歉!评论已关闭.