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

0 0
原创粉丝点击