您的位置:首页 > 职场人生

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

2014-06-05 20:42 260 查看
马上毕业了,在毕业之际,我辞掉了以前的实习工作,主要是工作内容不太感兴趣。最近在找工作,主要是找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

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

引用 /article/5524608.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。本广告长期有效.....玩笑话。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐