zoukankan      html  css  js  c++  java
  • 在弱网传输的情况下,是怎么做到节约流量的(面试小问题,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。本广告长期有效.....玩笑话。

  • 相关阅读:
    es6
    ES6
    ES6
    css3
    滚动穿透的6种解决方案【已自测】
    css特效
    css布局
    css布局
    js
    【消灭代办】第5周
  • 原文地址:https://www.cnblogs.com/blfbuaa/p/7148751.html
Copyright © 2011-2022 走看看