在弱网传输的情况下,是怎么做到节约流量的(面试小问题,Android篇)

马上毕业了,在毕业之际,我辞掉了以前的实习工作,主要是工作内容不太感兴趣。最近在找工作,主要是找Java和Android方面的工作。自以为学得不错,但是面试屡屡受挫。先提一下问到的一些问题吧。

第一个:在弱网传输的情况下,是怎么做到节约流量的?

由于Android接触的确实不多,这个问题自然没有很愉快的答上来。

我这样回答的:将一些数据进行压缩,例如传一个字符串,先将字符串转换成字符数组的形式,然后对这个字符数组进行压缩。然后就是对很多传输对象(一般都是JSON,XML这种方式太笨重了),提取公共的部分,然后只将不同的部分传输过去(我在想,怎么知道是相同的呢...)

自认为回答的不太好,面试官也没有多说。

面完试,在网上搜资料,加上自己的理解,整理了下。

首先来说一下Android与服务器的数据交互方式吧。

1、  Socket(TCP/UDP)

2、  NIO,还有衍生的NIO框架例如Netty

3、  WebService(特指Soap协议下用XML传输数据)

4、  JSON(特质http协议下用基于Rest风格的传输方式)

这里呢,说到数据压缩,我觉得应该是指将JSON进行先压缩再传输吧。

解决数据过大的问题,最直观的方法就是压缩数据。服务器将需要传递的数据先进行压缩,再发送给Android客户端,Android客户端接收到压缩的数据,对其解压,得到压缩前的数据。

下面这个图应该能说明具体情况。

引用http://www.cnblogs.com/lykbk/archive/2013/08/15/3259045.html

那么无非就是一些压缩算法的问题了。那怎么选择压缩算法咧?这里有一个压缩算法。

引用 http://www.cnblogs.com/answer1991/archive/2012/05/07/2487052.html

packagecom.chenjun.utils.compress;

importjava.io.ByteArrayInputStream;
importjava.io.ByteArrayOutputStream;
importjava.io.InputStream;
importjava.io.OutputStream;
importjava.util.zip.GZIPInputStream;
importjava.util.zip.GZIPOutputStream;

publicclass Compress {
    private static final int BUFFER_LENGTH =400;

    //压缩字节最小长度,小于这个长度的字节数组不适合压缩,压缩完会更大
    public static final int BYTE_MIN_LENGTH =50;

    //字节数组是否压缩标志位
    public static final byteFLAG_GBK_STRING_UNCOMPRESSED_BYTEARRAY = 0;
    public static final byteFLAG_GBK_STRING_COMPRESSED_BYTEARRAY = 1;
    public static final byteFLAG_UTF8_STRING_COMPRESSED_BYTEARRAY = 2;
    public static final byteFLAG_NO_UPDATE_INFO = 3;

    /**
     * 数据压缩
     *
     * @param is
     * @param os
     * @throws Exception
     */
    public static void compress(InputStream is,OutputStream os)
            throws Exception {  

        GZIPOutputStream gos = newGZIPOutputStream(os);  

        int count;
        byte data[] = newbyte[BUFFER_LENGTH];
        while ((count = is.read(data, 0,BUFFER_LENGTH)) != -1) {
            gos.write(data, 0, count);
        }  

        gos.finish();  

        gos.flush();
        gos.close();
    }  

    /**
     * 数据解压缩
     *
     * @param is
     * @param os
     * @throws Exception
     */
    public static void decompress(InputStreamis, OutputStream os)
            throws Exception {  

        GZIPInputStream gis = newGZIPInputStream(is);  

        int count;
        byte data[] = newbyte[BUFFER_LENGTH];
        while ((count = gis.read(data, 0,BUFFER_LENGTH)) != -1) {
            os.write(data, 0, count);
        }  

        gis.close();
    }

    /**
     * 数据压缩
     *
     * @param data
     * @return
     * @throws Exception
     */
    public static byte[] byteCompress(byte[]data) throws Exception {
        ByteArrayInputStream bais = newByteArrayInputStream(data);
        ByteArrayOutputStream baos = newByteArrayOutputStream(); 

        // 压缩
        compress(bais, baos); 

        byte[] output =baos.toByteArray(); 

        baos.flush();
        baos.close(); 

        bais.close(); 

        return output;
    }

    /**
     * 数据解压缩
     *
     * @param data
     * @return
     * @throws Exception
     */
    public static byte[] byteDecompress(byte[]data) throws Exception {
        ByteArrayInputStream bais = newByteArrayInputStream(data);
        ByteArrayOutputStream baos = newByteArrayOutputStream(); 

        // 解压缩 

        decompress(bais, baos); 

        data = baos.toByteArray(); 

        baos.flush();
        baos.close(); 

        bais.close(); 

        return data;
    }
}

笔者目前在找工作。邮箱[email protected]。本广告长期有效.....玩笑话。

在弱网传输的情况下,是怎么做到节约流量的(面试小问题,Android篇)

时间: 2024-08-26 15:43:19

在弱网传输的情况下,是怎么做到节约流量的(面试小问题,Android篇)的相关文章

在最坏情况下,找到n个元素中第二小的元素需要n+lgn-2次比较

首先两两比较找到最大的元素,需要n-1次,即二叉树的非叶子节点的个数.之后次最大的一定在和最大的元素比较过的元素中,共有lgn-1个,即树的高度.故加起来就是n+lgn-2 #include<iostream> using namespace std; class Node { public: Node(); Node(int d); Node*left; Node*right; int data; }; Node::Node() { right = left = NULL; } Node::

小程序弱网环境卡顿怎么办?一招迅速提升小程序运行速度

2018 年 1 月 15 日,微信公开课 PRO 在广州正式"开课".与往年不同,今年的微信公开课将整场大会的焦点都放在了小程序上.从 2017 年 1 月上线到现在,小程序依托于微信这个庞大的流量机器,在不知不觉间构建了一个新型的移动互联网生态圈. 微信小程序从麦当劳.肯德基等在线点餐服务到共享单车.共享充电宝等租用服务,再到与京东.拼多多等电商结合,小程序正在全方位的"入侵"人们的衣食住行.  △ 知晓程序官网小程序分类 张小龙在微信公开课上讲到:"

Chrome调试折腾记_(4)模拟弱网情况及请求筛选过滤

前言 有时候为了用户体验,我们做开发必须考虑弱网情况下访问体验,比如加载顺序,首屏在弱网的展示等: 有些小伙伴推荐用fiddler4 [用过,感觉还可以,功能很强大,自我感觉有些臃肿],但是在chrome也有弱网模拟的[用来搞前端接口请求,页面渲染的模拟足够用了] 使用 我不知道这个功能首次出现在什么版本,已知的只有chrome45+ 按下F12 -> 打开调试控制台,迷你菜单的Network选项,看截图 有三个功能比较实用,可以用来测试用户访问: Disable Cache(禁用缓存 – 开启

如何在没有外网的情况下,通过Centos系统光盘创建yum源,结果rpm包依赖性问题

如何在没有外网的情况下,通过Centos系统光盘创建yum源,结果rpm包依赖性问题 相信作为Linux系统管理员在安装rpm包的过程中或多或少都会遇到软件依赖性.通常我们的解决方法: 1.通过yum工具连接外网上的yum服务器来安装,自动帮忙解决软甲依赖性. 该方法能够快速解决软件依赖性问题,但是解决的前提是生产环境中有外光.如果我们的生产环境不允许连接或者不具备外网条件,基本上就没有办法解决了. 2.手动安装依赖性软件.这种方法较为原始的安装方法,只适合对软件依赖性较少的情况,如果所安装的软

计算机网络——网页上(或其他情况下)的视频传输是基于TCP还是UDP

计算机网络——网页上(或其他情况下)的视频传输是基于TCP还是UDP 1. 综述 链接:百度知道 当然,需要清楚,这里说基于TCP还是UDP是在传输层,应用层的协议估计种类多多. 总结找到的内容,应该说: 1. 网页上的视频是基于HTTP/HTTPS,传输层是TCP 2. QQ视频聊天等是基于UDP 3. 甚至有的应用使用p2p协议,传输层应该也是TCP 4. 通过http进行流化视频有很多种方法 5. 传输视频还有很多其他的应用层协议 一方面,在网页上看视频可以忍受缓冲5s看到更清楚的视频,所

linux最新版本Centos7,断网情况下安装应用程序(必备技能,一学就会)

一.上一章我们了解到可以直接再yum仓库当中安装程序,但是需要网络,而且不用解决依赖关系.这一章教你们如何在断网下安装程序1.我们先把网给断了(演示在没网的情况下,在VM虚拟机实现的)2.设置我们的网卡3.重启网络服务,并且查看我们刚才设置的地址4.清除我们之前yum list的缓存5.使用Centos7镜像,然后去连接6.把镜像挂载7.查看我们的软件包在哪儿?8.配置我们自己的yum仓库 9.查看我们的yum仓库软件包有没有10.输入安装httpd服务的命令11.我们试一试能不能使用访问这个网

CentOS 6.5本地yum源配置(断网情况下轻松安装各种依赖包)

yum能够自动查找并解决rpm包之间的依赖关系,要成功的使用yum工具更新系统和软件,需要有一个包含各种rpm软件包的repository(软件仓库),提供软件仓库的服务器习惯上成为“源”服务器.网络上有大量的源服务器,但是,由于受到网络连接速度.带宽的限制,导致软件安装耗时过长甚至失败.特别是当有大量服务器大量软件包需要升级时,更新的缓慢程序令人难以忍受. 相比较而言,本地YUM源服务器最大优点在局域网的快速网络连接和稳定性.有了局域网中的yum源服务器,即便在网络连接中断的情况下,也不会影响

弱网环境测试点总结

一.[弱网环境测试点总结] 1.场景:弱网环境下某个操作响应时间 原因:APP用户对等待时间容忍度低,若弱网环境loading超过5s,用户很容易kill应用后再次进入应用 [测试点]性能测试中,加入弱网环境测试点,检测各个场景网络请求的 API 消耗时间(此处可以放入性能测试中,做为衡量APP性能好坏的指标) 2.场景:弱网环境下直至超时,UI界面友好度&APP是否稳定 原因:容错机制主要是考虑弱网情况下带来的不稳定,常见的问题是:loading超时导致ANR or crash [测试点]弱网

APP网络测试要点和弱网模拟

当前APP网络环境比较复杂,网络制式有2G.3G.4G网络,还有越来越多的公共Wi-Fi.不同的网络环境和网络制式的差异,都会对用户使用app造成一定影响.另外,当前app使用场景多变,如进地铁.上公交.进电梯等,使得弱网测试显得尤为重要.如果app没有对各种网络异常进行兼容处理,那么用户可能在日常生活中遇到APP闪退.ANR.数据丢失等问题.因此,app网络测试,特别是弱网测试尤为重要.本文梳理了app网络测试要点和弱网测试常用模拟方法,让大家对网络测试有一个全面的认识. APP网络测试要点