在弱网传输的情况下,是怎么做到节约流量的(面试小问题,Android篇)
立即毕业了,在毕业之际。我辞掉了曾经的实习工作,主要是工作内容不太感兴趣。近期在找工作。主要是找Java和Android方面的工作。自以为学得不错。可是面试屡屡受挫。
先提一下问到的一些问题吧。
第一个:在弱网传输的情况下。是怎么做到节约流量的?
因为Android接触的确实不多,这个问题自然没有非常愉快的答上来。
我这样回答的:将一些数据进行压缩,比如传一个字符串,先将字符串转换成字符数组的形式,然后对这个字符数组进行压缩。
然后就是对非常多传输对象(一般都是JSON。XML这样的方式太笨重了),提取公共的部分,然后仅仅将不同的部分传输过去(我在想。怎么知道是同样的呢...)
自觉得回答的不太好,面试官也没有多说。
面完试,在网上搜资料。加上自己的理解。整理了下。
首先来说一下Android与server的数据交互方式吧。
1、 Socket(TCP/UDP)
2、 NIO,还有衍生的NIO框架比如Netty
3、 WebService(特指Soap协议下用XML数据传输)
4、 JSON(特质http协议下用基于Rest风格的传输方式)
这里呢,说到数据压缩,我认为应该是指将JSON进行先压缩再传输吧。
解决数据过大的问题,最直观的方法就是压缩数据。server将须要传递的数据先进行压缩。再发送给Androidclient,Androidclient接收到压缩的数据,对其解压。得到压缩前的数据。
以下这个图应该能说明详细情况。

引用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;
}
}
笔者眼下在找工作。
邮箱myhirra@126.com。本广告长期有效.....玩笑话。
在弱网传输的情况下,是怎么做到节约流量的(面试小问题,Android篇)的更多相关文章
- 使用Fiddler模拟弱网测试教程
一.下载抓包工具Fiddler 官网下载链接:https://www.telerik.com/fiddler 二.设置Fiddler Tools>>Connections 然后修改监听端 ...
- [原创]App弱网测试方法介绍
[原创]App弱网测试方法介绍 1 什么是弱网? 弱网就是在非正常网络状态下,用户在访问网络时遭遇到网络延迟或是丢包,造成使用产品时用户体验不佳或反感的场景. 2 为什么要进行弱网测试 简而方之, ...
- oracle 如何在表中有数据的情况下,修改表字段的类型或者增加表字段的长度
场景:项目中某张表的字段长度不够用了,现在要增加其长度 分两种情况: 1.表中没有数据的情况,直接一条sql语句就能解决 alter table 表名 modify(字段名 字 ...
- openfire在内网的情况下 文件传输代理的设置
openfire在内网的情况下 文件传输代理的设置 http://blog.csdn.net/v6543210/article/details/22506565
- [翻译] 编写高性能 .NET 代码--第二章 GC -- 减少大对象堆的碎片,在某些情况下强制执行完整GC,按需压缩大对象堆,在GC前收到消息通知,使用弱引用缓存对象
减少大对象堆的碎片 如果不能完全避免大对象堆的分配,则要尽量避免碎片化. 对于LOH不小心就会有无限增长,但LOH使用的空闲列表机制可以减轻增长的影响.利用这个空闲列表,我们可以在两块分配区域中间找到 ...
- struts项目部署在Tomca上在断网情况下启动报错
转载请注明出处:http://www.cnblogs.com/Joanna-Yan/p/6015693.html 前段时间,项目部署到现场后,反馈Tomcat能正常启动,但是项目有时访问不了也不报错. ...
- 发现linux主机再用代理上网的情况下不能用wget从外网下载资源
公司禁网(也不是完全禁,能连接外网数据库,不能下载东西,不能打开网页,但是却能打开谷歌的收索页面,只是不能点进网页) 发现linux主机再用代理上网的情况下不能用wget从外网下载资源,但是却可以从内 ...
- 【转载】struts应用在断网情况下启动报错解决办法(java/net/AbstractPlainSocketImpl.java:178:-1)
无意间struts应用在有网络的情况下启动正常,在断网的情况下启动报错,报错代码如下图所示: SEVERE: Exception starting filter struts2 Class: java ...
- 宝马男砍人不慎刀落反被杀 防卫过当or故意伤害(在生命受到威胁的情况下,已经很难判断对方意图了,而且假如于莫是老弱妇幼,可能现在死的就是于莫了)
如果被砍的是周律师他就不会说是防为过当吧,宝马车主跑回自己的车边时最危险,不知道他车上还有什么刀枪之类的.这如果判防卫过当,恶人会更恶,老实人连防卫都不敢了. 不知道在这个没有法治的国家会是如何判案的 ...
随机推荐
- python 2 encode and decode
https://docs.python.org/2/howto/unicode.html a Unicode string is a sequence of code points, which ar ...
- 基于Docker Compose搭建mysql主从复制(1主2从)
系统环境 * 3 Ubuntu 16.04 mysql 8.0.12 docker 18.06.1-ce docker-compose 1.23.0-rc3 *3 ==> PS ###我用的是 ...
- [Python3网络爬虫开发实战] 7.3-Splash负载均衡配置
用Splash做页面抓取时,如果爬取的量非常大,任务非常多,用一个Splash服务来处理的话,未免压力太大了,此时可以考虑搭建一个负载均衡器来把压力分散到各个服务器上.这相当于多台机器多个服务共同参与 ...
- 使用TensorRT加速yolo3
一.TensorRT支持的模型: TensorRT 直接支持的model有ONNX.Caffe.TensorFlow,其他常见model建议先转化成ONNX.总结如下: 1 ONNX(.onnx) 2 ...
- wepy 编译警告去除办法
如果你用过wepy打包小程序的话,那么你一定碰到了很多坑,(什么也不用说,抱一下吧)下面记录的是本人遇到的一个小坑, 编译的时候出现了黄色警告 如果你出现了上图这样的话,相信你一定也知道什么意思,就是 ...
- PHP:压缩 Zip
文章来源:http://www.cnblogs.com/hello-tl/p/7661222.html <?php # 文件字符集 header("Content-type: text ...
- Python中的数据类型之字符串
字符串的定义,可是使用类似下面的方式 name = "hello python" Python 中字符串自带了一些常用的方法,比如: title() #用来将每个单词首字母大写up ...
- Unity Water Shader
上图是一个物体浸入水中的效果 原理 我们使用相机渲染的整个场景的深度图减去需要忽略的模型的深度,这里忽略的是图中蓝色部分,就保留了其他的深度值. 用到Main Camera渲染的深度贴图: sampl ...
- 阿里云ubuntu服务器安装使用mysql并配置远程连接记录
实践2要继续做实践1的项目 项目在本地使用本地数据库对于团队开发来说太麻烦了 所以改把项目放在服务器上使用服务器数据库 进入主题 0.参考:https://www.cnblogs.com/ywf520 ...
- 九度oj 题目1473:二进制数(stack)
题目1473:二进制数 时间限制:1 秒 内存限制:128 兆 特殊判题:否 提交:9371 解决:2631 题目描述: 大家都知道,数据在计算机里中存储是以二进制的形式存储的. 有一天,小明学了C语 ...