android中gzip数据压缩与网络框架解压缩

目录
  • theme: smartblue
    • 开GZIP有什么好处?
  • Java中gzip压缩和解压实现
    • 字节流压缩:
    • 字节流解压:
  • 网络框架解压缩(gzip)
    • 使用步骤:
      • 构造消息发送类(post调用的对象)
      • 发布消息
      • 接收消息:可以有四种线程模型选择
  • 文末

theme: smartblue

gzip是一种常用的压缩算法,它是若干种文件压缩程序的简称,通常指GNU计划的实现,此处的gzip代表GNU zip。

HTTP协议上的GZIP编码是一种用来改进WEB应用程序性能的技术。大流量的WEB站点常常使用GZIP压缩技术来让用户感受更快的速度。

开GZIP有什么好处?

Gzip开启以后会将输出到用户浏览器的数据进行压缩的处理,这样就会减小通过网络传输的数据量,提高浏览的速度。

Java中gzip压缩和解压实现

字节流压缩:

    /**
     * 字节流gzip压缩
     * @param data
     * @return
     */
    public static byte[] gZip(byte[] data) {
        byte[] b = null;
        try {
            ByteArrayInputStream in = new ByteArrayInputStream(data);
            ByteArrayOutputStream out = new ByteArrayOutputStream();
            GZIPOutputStream gzip = new GZIPOutputStream(out);
            byte[] buffer = new byte[4096];
            int n = 0;
            while((n = in.read(buffer, 0, buffer.length)) > 0){
                gzip.write(buffer, 0, n);
            }
            gzip.close();
            in.close();
            b = out.toByteArray();
            out.close();
        } catch (Exception ex) {
            ex.printStackTrace();
        }
        return b;
    }

字节流解压:

    /**
     * gzip解压
     * @param data
     * @return
     */
    public static byte[] unGZip(byte[] data){
        // 创建一个新的输出流
        ByteArrayOutputStream out = new ByteArrayOutputStream();
        try {
            ByteArrayInputStream in = new ByteArrayInputStream(data);
            GZIPInputStream gzip = new GZIPInputStream(in);
            byte[] buffer = new byte[4096];
            int n = 0;
            // 将解压后的数据写入输出流
            while ((n = gzip.read(buffer)) >= 0) {
                out.write(buffer, 0, n);
            }
            in.close();
            gzip.close();
            out.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return out.toByteArray();
    }

网络框架解压缩(gzip)

一、采用内存数据库保存记录。

二、请求时采用重新开新线程方式,在子线程中请求网络请求。

三、数据请求后,可通过EventBus来设置返回结果的参数和返回信息,若其它类需要获取状态时,需要自己注册监听,动态去获取返回值。

使用场景:应用程序内各组件间、组件与后台线程间的通信。

比如请求网络,等网络返回时通过Handler或Broadcast通知UI,两个Fragment之间需要通过Listener通信,这些需求都可以通过EventBus实现。

使用步骤:

​
\1. 添加依赖:implementation 'org.greenrobot:eventbus:3.0.0'
​
\2. 注册:EventBus.getDefault().register(this);
​

构造消息发送类(post调用的对象)

public class Student {
private String name;
private int age;
​
public Student(String name, int age) {
this.name = name;
this.age = age;
}
public void setName(String name) {
this.name = name;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
}

发布消息

EventBus.getDefault().post(new Student("刘哈哈", 27));

接收消息:可以有四种线程模型选择

//接收事件
@Subscribe(threadMode = ThreadMode.MAIN)
public void studentEventBus(Student student){
mShow.setText("姓名:"+student.getName()+" "+"年龄:"+student.getAge());
}

解注册(防止内存泄漏):EventBus.getDefault().unregister(this);

网络请求成功后,需要注意文件流的大小,太大容易下载缓慢,解决缓慢问题

1、JSON返回格式,尽量去KEY,将JSONOBJECT修改为JSONArray格式。

2、对数据进行压缩,采用GZIP对数据进行压缩处理:网络请求时服务器对数据压缩,移动端请求到结果后,再进行解压。

文末

在网络传输中我们一般都会开启GZIP压缩,但是出于刨根问底的天性仅仅知道如何开启就不能满足俺的好奇心的,所以想着写个demo测试一下比较常用的两个数据压缩方式,GZIP/ZIP压缩。

GZIP是网站压缩加速的一种技术,对于开启后可以加快我们网站的打开速度,原理是经过服务器压缩,客户端浏览器快速解压的原理,可以大大减少了网站的流量。

以上就是android中gzip数据压缩与网络框架解压缩的详细内容,更多关于android gzip数据压缩解压缩的资料请关注我们其它相关文章!

(0)

相关推荐

  • 在Android系统中使用gzip进行数据传递实例代码

    接下来,让我解说一下如何在Android系统中使用gzip进行数据传递 HTTP协议上的GZIP编码是一种用来改进WEB应用程序性能的技术.大流量的WEB站点常常使用GZIP压缩技术来减少文件大小,减少文件大小有两个明显的好处,一是可以减少存储空间,二是通过网络传输文件时,可以减少传输的时间.作者在写这篇博客时经过测试,4.4MB的文本数据经过Gzip传输到客户端之后变为392KB,压缩效率极高. 一.服务端 服务端有2种方式去压缩,一种可以自己压缩,但是更推荐第二种方式,用PrintWrite

  • Android 基于Bitmap的四种图片压缩方式

    知识点介绍 Android 中图片主要以 Bitmap 的形式存在,所以压缩图片主要就是减少 Bitmap 的大小.Bitmap 的大小可以通过如下的公式计算得到:size = width * height * 单个像素所占字节数.因此压缩图片通过改变公式中的三个变量即可实现. 单个像素所占空间大小在 Android 中有多种,详见如下 格式 所占空间 说明 Bitmap.Config.ALPHA_8 1B 该种格式表示图片只有透明度没有颜色,1个像素占用8位 Bitmap.Config.ARG

  • Android三种常见的图片压缩方式

    下面就为大家带来3种比较常见的压缩方式 先给出一组数据 原图:width:2976; height:2976 原图实际:--->byte:2299820 Mb:2.19328 质量压缩 size--->:byte:1599831 kb:1562.33496 按比例压缩 size--->:byte:191707 kb:187.21387 鲁班压缩 size--->:byte:143792 kb:140.42188 压缩效果:鲁班压缩 > 按比例压缩 > 质量压缩 1.质量

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

    Android  GZip: gzip是GNUzip的缩写,它是一个GNU自由软件的文件压缩程序. HTTP协议上的GZIP编码是一种用来改进WEB应用程序性能的技术.一般服务器中都安装有这个功能模块的,服务器端不需做改动. 当浏览器支持gzip 格式的时候, 服务器端会传输gzip格式的数据. 从Http 技术细节上讲,就是 http request 头中 有 "Accept-Encoding", "gzip" ,response 中就有返回头Content-En

  • Android zip4j压缩、解压、加解密的示例代码

    jdk有原生的zip包,因为用起来没有达到想要的效果,所以此次用的是第三方zip4j开源 zip4j.jar官网下载链接 直接代码: package com.dfxh.wang.compress_operate; import android.util.Log; import net.lingala.zip4j.core.ZipFile; import net.lingala.zip4j.exception.ZipException; import net.lingala.zip4j.model

  • Android 不解压直接读取zip包的方法

    之前项目中遇到个需求,总监让我们把从服务器下载下来的资源不解压直接读取里面的资源,这样的话就省去了一个个校验资源是否正确的步骤,听着貌似有点道理...废话不多说直接上代码. 目前我所试验过的可以读取的资源有文本.图片.xml文件. 文本: zip包目录结构:res/txt/data.json 文件sd卡路径:android.os.Environment.getExternalStorageDirectory() + "/res.zip" public static String rea

  • android中gzip数据压缩与网络框架解压缩

    目录 theme: smartblue 开GZIP有什么好处? Java中gzip压缩和解压实现 字节流压缩: 字节流解压: 网络框架解压缩(gzip) 使用步骤: 构造消息发送类(post调用的对象) 发布消息 接收消息:可以有四种线程模型选择 文末 theme: smartblue gzip是一种常用的压缩算法,它是若干种文件压缩程序的简称,通常指GNU计划的实现,此处的gzip代表GNU zip. HTTP协议上的GZIP编码是一种用来改进WEB应用程序性能的技术.大流量的WEB站点常常使

  • Android中利用NetworkInfo判断网络状态时出现空指针(NullPointerException)问题的解决方法

    在Android中,很多人会用如下的方法判断当前网络是否可用: /** * 获取当前网络状态(是否可用) */ public static boolean isNetworkAvailable() { boolean isAalable = false; ConnectivityManager connManager = (ConnectivityManager) BaseApplication.getApplication().getSystemService(Context.CONNECTI

  • Android中判断有无可用网络的代码(是否是3G或者WIFI网络)

    复制代码 代码如下: ConnectivityManager mConnectivity = (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE); TelephonyManager mTelephony = (TelephonyManager)this.getSystemService(TELEPHONY_SERVICE); //检查网络连接,如果无网络可用,就不需要进行连网操作等 NetworkInfo inf

  • Android中监听判断网络连接状态的方法

    在无网或网速差的状态下,没必要去连接服务器. 你可以使用 ConnectivityManager 来判断是否连到网络,以及网络类型. 判断是否有网络连接 下面的代码用ConnectivityManager查询是活动网络连接判断是否有Internet连接. 复制代码 代码如下: ConnectivityManager cm =         (ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE);  

  • Android中监听系统网络连接打开或者关闭的实现代码

    很简单,所以直接看代码 复制代码 代码如下: package xxx; import android.content.BroadcastReceiver;  import android.content.Context;  import android.content.Intent;  import android.net.ConnectivityManager;  import android.net.NetworkInfo; 复制代码 代码如下: public class NetstateR

  • Android 7.0 监听网络变化的示例代码

    Android7.0前,Android系统前网络切换时,会发广播,业务只要监听广播即可. public class NetChangeReceiver extends BroadcastReceiver { private static final String ANDROID_NET_CHANGE_ACTION = "android.net.conn.CONNECTIVITY_CHANGE"; @Override public void onReceive(Context conte

  • Android中Volley框架进行请求网络数据的使用

    问题的阐述:Android SDK中的HttpClient和HttpUrlConnection两种请求方式用来处理网络的复杂的操作,但当应用比较复杂的时候需要我们编写大量的代码处理很多东西:图像缓存,请求的调度等等: 解决:Volley就是为解决这些而生,它与2013年Google I/O大会上被提出:使得Android应用网络操作更方便更快捷:抽象了底层Http Client等实现的细节,让开发者更专注与产生RESTful Request.另外,Volley在不同的线程上异步执行所有请求而避免

  • Android中网络框架简单封装的实例方法

    Android中网络框架的简单封装 前言 Android作为一款主要应用在移动终端的操作系统,访问网络是必不可少的功能.访问网络,最基本的接口有:HttpUrlConnection,HttpClient,而在后续的发展中,出现了Volley,OkHttp,Retrofit等网络封装库.由于各种原因,在实际的项目开发中,我们可能会需要在项目的版本迭代中,切换网络框架.如果对于网络框架没有好的封装,那么当需要切换网络框架时,可能就会有大量的迁移工作要做. 封装网络框架 在架构设计中,面向接口和抽象,

  • Android中XUtils3框架使用方法详解(一)

    xUtils简介 xUtils 包含了很多实用的android工具. xUtils 支持大文件上传,更全面的http请求协议支持(10种谓词),拥有更加灵活的ORM,更多的事件注解支持且不受混淆影响... xUitls 最低兼容android 2.2 (api level 8) 今天给大家带来XUtils3的基本介绍,本文章的案例都是基于XUtils3的API语法进行的演示.相信大家对这个框架也都了解过, 下面简单介绍下XUtils3的一些基本知识. XUtils3一共有4大功能:注解模块,网络

  • Android中Volley框架下保持会话方法

    公司经理把我拉出来,死马当活马医,做一个安卓app,作为刚毕业几个月且只是培训了几个月的小白来说,这无疑是一个非常大的挑战,当然最大的挑战不是这个,最大的挑战时两个周做出来.这是最蛋疼的,说实话,对于有两三年的开发经验的人来说,两个周开发一个项目很简单,说不定还有很多时间用来干别的. 于是一上来就把自己给难住了,登陆还是很好做的,只要验证返回的信息就可以跳转,但是在接下来后面的数据接口连接的时候各种报错,整了两天,查了很多信息,还接受了公司老人的嘲讽和谩骂终于做出来了. 这个是基于session

随机推荐