Android开发,使用Volley框架进行简单数据交互
2015-10-27 16:17
711 查看
在初次进行网络数据交互的时候,最开始使用的是http,然后自己准备一步步的写,然后突然发现,我不会。。。果然我基础还是太差了么=。=
然后就在网上开始寻找可以用的框架,其实当时也并不知道哪个好,试过了好几种方法,最后第一个成功的就是Volley,我很喜欢这个框架,不知道是因为简单,还是因为这是我唯一成功过的一个框架。。。
在这里写下来希望能帮助他人。
Volley在我看来还是一个很简单的网络库。
我喜欢把一些方法弄成一个工具类,即使这个方法只用一次,即使这个方法很短,我都会这么做,因为方便我以后用的时候好看,也好直接搬到其他地方去。
所以,先建一个Volley发送请求的工具类Request_Util.java:
上面的:
接下来开始使用:
在某个点击发送信息的地方
这是我进行注册的一个动作
注意:这里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()中需要进行操作:
嗯,要这么做,首先你得把Request<JsonObject>放到外面变成全局变量,这个应该都明白吧。。。。。
希望有帮助。
然后就在网上开始寻找可以用的框架,其实当时也并不知道哪个好,试过了好几种方法,最后第一个成功的就是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>放到外面变成全局变量,这个应该都明白吧。。。。。
希望有帮助。
相关文章推荐
- Android Canvas使用
- Android动画循环弹动cycleInterpolator
- 关于EditText组件在android4.4W中出现黄色感叹号的问题?
- Android数据存储的5种方法
- Android数据存储的5种方法
- android开发之使用上下文菜单
- android开发之使用上下文菜单
- android开发之使用上下文菜单
- android开发之使用上下文菜单
- Android抽奖(大转盘,随机)
- Android四大基本组件介绍与生命周期
- Android开发环境搭建
- Android开发,将图片(bitmap)变成圆形图片、图片文件变成bitmap的方法
- Android自动登录与记住密码
- android 广告栏 viewpager
- android .9.png ”点九” 图片制作方法
- ListView的基础应用
- Android把view的画面转换为bitmap
- Android背景选择器、Textview点击效果
- Android基础入门教程——8.3.8 Paint API之—— Xfermode与PorterDuff详解(五)