Android  GZip的使用-开发中网络请求的压缩实例详解

 更新时间:2016年11月10日 17:25:21   投稿:lqh  
这篇文章主要介绍了Android GZip的使用-开发中网络请求的压缩实例详解的相关资料,需要的朋友可以参考下

Android  GZip:

gzip是GNUzip的缩写,它是一个GNU自由软件的文件压缩程序。

HTTP协议上的GZIP编码是一种用来改进WEB应用程序性能的技术。一般服务器中都安装有这个功能模块的,服务器端不需做改动。

当浏览器支持gzip 格式的时候, 服务器端会传输gzip格式的数据。

从Http 技术细节上讲,就是 http request 头中 有 "Accept-Encoding", "gzip" ,response 中就有返回头Content-Encoding=gzip

我们现在从浏览器上访问玩啥网站都是gzip格式传输的。

但是我们现在Android 客户端,没有用gzip 格式访问。

同样的的道理,我们可以在android 客户端 request 头中加入 "Accept-Encoding", "gzip" ,来让服务器传送gzip 数据。

具体代码如下。

  private String getJsonStringFromGZIP(HttpResponse response) {
    String jsonString = null;
    try {
      InputStream is = response.getEntity().getContent();
      BufferedInputStream bis = new BufferedInputStream(is);
      bis.mark(2);
      // 取前两个字节
      byte[] header = new byte[2];
      int result = bis.read(header);
      // reset输入流到开始位置
      bis.reset();
      // 判断是否是GZIP格式
      int headerData = getShort(header);
      // Gzip 流 的前两个字节是 0x1f8b
      if (result != -1 && headerData == 0x1f8b) {
        LogUtil.d("HttpTask", " use GZIPInputStream ");
        is = new GZIPInputStream(bis);
      } else {
        LogUtil.d("HttpTask", " not use GZIPInputStream");
        is = bis;
      }
      InputStreamReader reader = new InputStreamReader(is, "utf-8");
      char[] data = new char[100];
      int readSize;
      StringBuffer sb = new StringBuffer();
      while ((readSize = reader.read(data)) > 0) {
        sb.append(data, 0, readSize);
      }
      jsonString = sb.toString();
      bis.close();
      reader.close();
    } catch (Exception e) {
      LogUtil.e("HttpTask", e.toString(),e);
    }
 
    LogUtil.d("HttpTask", "getJsonStringFromGZIP net output : " + jsonString );
    return jsonString;
  }
 
  private int getShort(byte[] data) {
    return (int)((data[0]<<8) | data[1]&0xFF);
  }

参考 ,注意实际使用中,我发现gzip 流前两个字节是0x1e8b ,不是0x1f8b .后来检查一下code ,代码处理错误,加上第二个字节的时候需 &0xFF0x1f8b

可参考标准

http://www.gzip.org/zlib/rfc-gzip.html#file-format
http://xmagicj.diandian.com/post/2011-08-08/3641381

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

相关文章

  • android View 绘制完成监听的实现方法

    android View 绘制完成监听的实现方法

    今天小编就为大家分享一篇android View 绘制完成监听的实现方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-09-09
  • Flutter进阶之实现动画效果(三)

    Flutter进阶之实现动画效果(三)

    这篇文章主要为大家详细介绍了Flutter进阶之实现动画效果,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-08-08
  • Android实现Ant Design 自定义表单组件

    Android实现Ant Design 自定义表单组件

    Ant Design 组件提供了Input,InputNumber,Radio,Select,uplod等表单组件,下面通过本文给大家详细介绍Android实现Ant Design 自定义表单组件,需要的的朋友参考下吧
    2017-06-06
  • Android usb设备权限查询及自动获取详解流程

    Android usb设备权限查询及自动获取详解流程

    本篇文章介绍了我想要获取Android系统usb设备使用权限时遇到的问题,以及解决该问题的过程及思路,通读本篇对大家的学习或工作具有一定的价值,需要的朋友可以参考下
    2021-10-10
  • Android使用Pull解析器解析xml文件的实现代码

    Android使用Pull解析器解析xml文件的实现代码

    Android使用Pull解析器解析xml文件的实现代码,需要的朋友可以参考一下
    2013-02-02
  • Android仿QQ圆形头像个性名片

    Android仿QQ圆形头像个性名片

    这篇文章主要为大家详细介绍了Android仿QQ圆形头像个性名片的制作方法,涉及圆形头像和光环波形设计,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-11-11
  • 总结Android中多线程更新应用的页面信息的方式

    总结Android中多线程更新应用的页面信息的方式

    这篇文章主要介绍了总结Android中多线程更新应用的页面信息的方式,文中共总结了runOnUiThread、Handler、AsyncTask异步以及View直接在UI线程中更新的方法,需要的朋友可以参考下
    2016-02-02
  • Android自定义定时闹钟开发

    Android自定义定时闹钟开发

    这篇文章主要为大家详细介绍了Android自定义定时闹钟开发,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-09-09
  • Android Flutter实现精灵图的使用详解

    Android Flutter实现精灵图的使用详解

    在游戏开发中,精灵图会将一个人物所有动作放置在一张图片中,通过坐标定位选取其中一张图展示。本文就来教你如何使用精灵图,感兴趣的可以了解一下
    2022-08-08
  • 简单实现Android验证码

    简单实现Android验证码

    在登录或者注册的时候要求输入验证码,这篇文章主要为大家详细介绍了如何简单实现Android验证码的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-12-12

最新评论