对android volley框架的理解(一)
2015-07-18 12:56
671 查看
谷歌发布的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流来进行一些转码的操作。解决字体的乱码问题。
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 框架其实很不错的。可以满足我们很多自定义的需求。
今天写这篇博客,主要是说一下对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实现表情 抓取新浪表情
- 详解Android解析Xml的三种方式——DOM、SAX以及XMLpull
- android开发环境遇到adt无法启动的问题分析及解决方法
- Android开发 旋转屏幕导致Activity重建解决方法
- Android开发技巧之在a标签或TextView控件中单击链接弹出Activity(自定义动作)
- Android开发技巧之ViewStub控件惰性装载
- 分享10个很棒的学习Android开发的网站
- android开发之横向滚动/竖向滚动的ListView(固定列头)
- Android开发技巧之我的菜单我做主(自定义菜单)
- 基于JAVA中Jersey处理Http协议中的Multipart的详解
- Windows下使用Apache Cordova开发ANDROID之HelloWorld
- HTTP协议理解与应用总结
- 根据根据图片的url怎么取得图片ImageView对象
- HTTP协议详解
- [转] ADB server didn't ACK
- android开发的相关链接
- Android数据存储之SharedPreferences 共享首选项/偏好设置
- 协议-HTTP协议详解
- 基于NDK的Android防破解
- HTTP协议详解(转帖:非常经典)