对android volley框架的理解(一)

            谷歌发布的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 框架其实很不错的。可以满足我们很多自定义的需求。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值