Android开发,使用Volley框架进行简单数据交互

在初次进行网络数据交互的时候,最开始使用的是http,然后自己准备一步步的写,然后突然发现,我不会。。。果然我基础还是太差了么=。=

然后就在网上开始寻找可以用的框架,其实当时也并不知道哪个好,试过了好几种方法,最后第一个成功的就是Volley,我很喜欢这个框架,不知道是因为简单,还是因为这是我唯一成功过的一个框架。。。

在这里写下来希望能帮助他人。

Volley在我看来还是一个很简单的网络库。

我喜欢把一些方法弄成一个工具类,即使这个方法只用一次,即使这个方法很短,我都会这么做,因为方便我以后用的时候好看,也好直接搬到其他地方去。

所以,先建一个Volley发送请求的工具类Request_Util.java:

	/**
	 * 封装好 用于发送请求的工具类
	 * @author Stanny
	 *
	 * 2015年8月20日
	 */
	public class Request_Util extends Request<JSONObject> {
		
	    private Map<String, String> mMap;
	    private Listener<JSONObject> mListener;
	    public String mSessionID;
	    public Request_Util(int method, String url, Listener<JSONObject> listener,ErrorListener errorListener, Map<String, String> map, String SessionID) {
	        super(method, url, errorListener);
	        mListener = listener;
	        mMap = map;
	        mSessionID = SessionID;
	    }
	    //mMap是已经按照前面的方式,设置了参数的实例
	    @Override
	    protected Map<String, String> getParams() throws AuthFailureError {
	        return mMap;
	    }
	    //此处因为response返回值需要json数据,和JsonObjectRequest类一样即可
	    @Override
	    protected Response<JSONObject> parseNetworkResponse(NetworkResponse response) {
	    	try {
	            String jsonString = new String(response.data,HttpHeaderParser.parseCharset(response.headers)); 
	            Log.e("jsonString", jsonString);
	            return Response.success(new JSONObject(jsonString),HttpHeaderParser.parseCacheHeaders(response));
	        } catch (UnsupportedEncodingException e) {
	            return Response.error(new ParseError(e));
	        } catch (JSONException e) {
	            return Response.error(new ParseError(e));
	        }
	    }
	    @Override
	    public Map<String, String> getHeaders() throws AuthFailureError {
	    	Map<String, String> headers = new HashMap<String, String>();
	    	if (mSessionID != null) {
	    		//添加http请求报头,保持会话,而不重新开启会话
	    		headers.put("Accept", "*/*");
	    		headers.put("Connection", "keep-alive");
				headers.put("Cookie", "JSESSIONID="+mSessionID);
				Log.e("headers", headers.toString());
			}
	    	return headers;
	    }
	    @Override
	    protected void deliverResponse(JSONObject response) {
	        mListener.onResponse(response);
	    }
	}

上面的:

@Override
	    public Map<String, String> getHeaders() throws AuthFailureError {
	    	Map<String, String> headers = new HashMap<String, String>();
	    	if (mSessionID != null) {
	    		//添加http请求报头,保持会话,而不重新开启会话
	    		headers.put("Accept", "*/*");
	    		headers.put("Connection", "keep-alive");
				headers.put("Cookie", "JSESSIONID="+mSessionID);
				Log.e("headers", headers.toString());
			}
	    	return headers;
	    }
是设置请求报头,一般来说可以就保持这样不需要改变,如果有误,与做服务器端的商量下可以进行更改。

接下来开始使用:

在某个点击发送信息的地方

public void onClick(View view){
    send_info();
}
//注只是我方便自己使用建的一个方法。
<pre name="code" class="java">/**
	 * 调用网络请求,将数据进行封装,并发送
	 * @param username
	 * @param pwd
	 */
	private void send_info(final String username, final String pwd) {
		//封装参数并进行发送
		HashMap<String, String> user_pwd = new HashMap<String, String>();
		user_pwd.put("username", username);
		user_pwd.put("pwd", pwd);
		user_pwd.put("channel", "AppStore");
		user_pwd.put("from", "android");
		RequestQueue requestQueue = Volley.newRequestQueue(getApplicationContext());
		Request<JsonObject> request = new Request_Util(Method.POST, registerUrl,
				new Response.Listener<JSONObject>() {//正确回调监听
					@Override
					public void onResponse(JSONObject response) {
						//进行数据解析
						gson_info(response);
					}
				}, new Response.ErrorListener() {//错误监听
					@Override
					public void onErrorResponse(VolleyError error) {
						//错误处理
					}
				}, user_pwd,null);
		request.setRetryPolicy(new DefaultRetryPolicy(7 * 1000, 0, 1.0f));
		// 添加请求
		requestQueue.add(request);
	}

 

这是我进行注册的一个动作

注意:这里Requst_Util(),我需要4个参数传过去

1.Method.POST,这是以什么方式发送,一般都是POST,GET这两种

2.registerUrl,这是你的请求将要发送到的那个URL地址

3.user_pwd,这是一个map,当使用POST方式传送数据时就需要封装一个Map,里面是你要发送的以键值对的方式存在的信息。当使用GET时,改成null即可

4.sessionid,我这里写的是null,因为注册的时候不需要sessionid来维持登录状态(即同一个状态号),在其他地方,比如已经登录后,要执行某个操作,但是要保持登录,就需要带着sessionid传过去


里面有两个监听

一个Response.Listenner,用于接收成功发送数据接到的回调response,可以对它进行处理

另一个Response.ErrorListenner,用于在数据发送失败(如网络问题,服务器问题,数据问题等),可以根据返回的error判断错误类型,来提示用于错误的原因


就这样应该就可以使用了。

另外,注意一个情况,当正在发送数据的时候,如果结束了这个Activity,可能会导致错误,在这个ACtivity的OnStop()中需要进行操作:

	/**
	 * 在请求发送或返回前结束了activity,就取消request请求
	 */
	@Override
	protected void onStop() {
		super.onStop();
		if (request != null) {
			request1.cancel();
		}

	}
嗯,要这么做,首先你得把Request<JsonObject>放到外面变成全局变量,这个应该都明白吧。。。。。

希望有帮助。




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值