標籤: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]。本廣告長期有效.....玩笑話。