对android volley框架的理解(一)
来源:互联网 发布:用java写雷电x 小游戏 编辑:程序博客网 时间:2024/06/04 18:37
谷歌发布的android volley框架,是一个很稳定,也很简单,开放的通信框架。关于这个框架的基础的使用,我们可以参考这个链接,写挺好的http://www.apihome.cn/view-detail-70211.html
今天写这篇博客,主要是说一下对volley框架的一些需要在项目中使用的比较灵活的方法和对volley框架源代码的的理解。(理解之后在第二篇)
volley框架基础的东西我们可以从那个链接上得到,这次主要在项目中使用的一些功能。
1.如何在volley框架里面获取cookie(session)的数值。并且放到HTTP的报文头中去呢?这个要根据volley的框架的request的源代码。
这个是volley框架的request的继承体系,其实写的挺好的,面向接口编程,我们平时需要的用到的东西都体现到了。这个基础的类中,有些方法我们可以复写,来实现我们的一些需求。
怎么去解析http中的cookie呢?我们可以继承request中的parseNetworkResponse这个方法,这个方法是解析reponse对象的方法,一般在stringRequest的中,直接把HTTP的报文体给我们。但是,我们可以通过覆写这个方法,可以写出获取http头不信息的代码:
代码如下:
@Override protected Response<String> parseNetworkResponse(NetworkResponse response) { String header = new String(); String cookieReponse = new String(); String reponsestr = new String(); JSONObject jsonObject = new JSONObject(); try { reponsestr = new String(response.data, HttpHeaderParser.parseCharset(response.headers)); header = response.headers.toString(); Pattern pattern = Pattern.compile("Set-Cookie.*?;"); Matcher m = pattern.matcher(header); if (m.find()) { cookieReponse = m.group(); cookieReponse = cookieReponse.substring(11, cookieReponse.length() - 1); } jsonObject = new JSONObject(reponsestr); jsonObject.put("cookie", cookieReponse); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } catch (JSONException e) { e.printStackTrace(); } return (Response.success(jsonObject.toString(), HttpHeaderParser.parseCacheHeaders(response))); }}注:这个方法也可以把用java的I/O流来进行一些转码的操作。解决字体的乱码问题。
reponsestr = new String(response.data, HttpHeaderParser.parseCharset(response.headers));
2.我们怎么把cookie的数值放入报文头中去呢?也是继承request的方法,这个getHeaders() 这个方法,这个方法返回的就是一个Map(映射表),比如cookie的值,还有别的一些需要加http头中的选项。
@Override public Map<String, String> getHeaders() throws AuthFailureError { Map<String,String> httpHead=this.mPrePareParams.getCookieHead(); return(httpHead); }
3.我们要自己把去写报文体怎么办呢?
有的时候,我们需要模拟一种前端的上传文件的表单(一种混合的表单),内部有文件,也有字符的,我们要怎么写。其实我在去年的一篇博客里面也是记录了。但是那一次是使用的httpconnection API来写的,这次我们基于volley来重写方法。先贴上代码:
public class PostUpLoadRequest extends CookieReuqest { private File uploadFile; public PostUpLoadRequest(int method,String url,Response.Listener<String> listener,Response.ErrorListener errorListener){ super(method,url,listener,errorListener); } public PostUpLoadRequest(String url,Response.Listener<String> listener,Response.ErrorListener errorListener){ super(url,listener,errorListener); } public PostUpLoadRequest(int method,String url,Response.Listener<String> listener,Response.ErrorListener errorListener,File uploadFile){ super(method,url,listener,errorListener); this.uploadFile=uploadFile; } @Override public byte[] getBody() throws AuthFailureError { ByteArrayOutputStream bos=new ByteArrayOutputStream(); String boundary= ComParameter.BOUNDARY;//定义表单的边界符号 String twoHyphens="--";//http请求体格式 String end="\r\n";//换行符号 String picFileName=this.uploadFile.getName(); StringBuilder strBuilderHead=new StringBuilder(); StringBuilder stringBuilderEnd=new StringBuilder(); strBuilderHead.append(twoHyphens+boundary+end); strBuilderHead.append("Content-Disposition:form-data;name=\"headpic\";filename=\""+picFileName+" \""+end); strBuilderHead.append(end); stringBuilderEnd.append(end); stringBuilderEnd.append(twoHyphens+boundary+twoHyphens+end); try { bos.write(strBuilderHead.toString().getBytes("utf-8")); byte [] postFileByte= PicUtils.getSmallBitmap(this.uploadFile.getAbsolutePath()); bos.write(postFileByte); bos.write(stringBuilderEnd.toString().getBytes("utf-8")); }catch(IOException e){ e.printStackTrace(); } return(bos.toByteArray()); } @Override public Map<String, String> getHeaders() throws AuthFailureError { Map<String,String> httpHead=this.mPrePareParams.getCookieHead(); return(httpHead); //上传cookie } @Override public String getBodyContentType() { return (ComParameter.MULTIPART_FORM_DATA+";boundary="+ComParameter.BOUNDARY); //声明文件的content-type的内容 }}这类就是继承了stringrequest的类,我们可以看到,平时我们可能只是覆写 Map<String, String> getParams(),这个方法来得到参数,但是,这次我们要接触更加底层一点的东西,就是怎么去写报文体。在volley框架覆getBody()这个方法,不过要看清楚,这个方法,返回的是一个byte[]字节流数组。其实也是符合网络的要求,本来到了物理层也就是字节流。所以也很简单。我们把文件也写成字节数组放在这里面,然后在加上HTTP报文体的格式。妥当了。
覆写这个方法:getBodyContentType(),是自定义我们的在报文头中的分隔符号。
以上就是volley框架一些复杂的理解,其实大家是不是感觉还是挺简单的。volley 框架其实很不错的。可以满足我们很多自定义的需求。
- 对android volley框架的理解(一)
- 对android volley框架的理解(二 )
- Volley框架的初步理解(一)
- Android Volley 框架的使用(一)
- Android Volley 框架的使用(一)
- 对Volley网络框架的一些理解
- Android中常用的框架 Volley 联网框架 (一)
- android Volley请求网络框架的使用(一)
- Android网络框架总结Volley(一)
- Android中的网络框架 Volley(一)
- Android Volley的理解
- android网络框架Volley(一)
- android Volley框架学习一
- Android Volley框架使用(一)
- Android Volley框架使用(一)
- android的volley框架
- android的volley框架
- 对Android官方网络框架——volley的封装
- atitit.jndi的架构与原理以及资源配置and单元测试实践
- JAVA事件处理机制3
- HDU-1865-1sting
- 20150718,about c.
- 4Sum
- 对android volley框架的理解(一)
- 开源完整版:《开源框架实战宝典电子书V1.0.0》内测版下载地址!
- js输入一个日期判断该日期是该年的第几天
- 使用ANT编译项目报错 com.sun.image.codec.jpeg does not exist 解决方法
- Tkinter 控件详细介绍
- iOS代理模式
- c++Builder 2009 2010 出现Cannot convert 'wchar_t *' to 'const char *
- 整数实现翻转---java实现
- Cordys JAVA Object理解