您的位置:首页 > 移动开发 > Android开发

对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流来进行一些转码的操作。解决字体的乱码问题。
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 框架其实很不错的。可以满足我们很多自定义的需求。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息