Android GZip的使用-開發(fā)中網(wǎng)絡(luò)請求的壓縮實(shí)例詳解
Android GZip:
gzip是GNUzip的縮寫,它是一個(gè)GNU自由軟件的文件壓縮程序。
HTTP協(xié)議上的GZIP編碼是一種用來改進(jìn)WEB應(yīng)用程序性能的技術(shù)。一般服務(wù)器中都安裝有這個(gè)功能模塊的,服務(wù)器端不需做改動(dòng)。
當(dāng)瀏覽器支持gzip 格式的時(shí)候, 服務(wù)器端會(huì)傳輸gzip格式的數(shù)據(jù)。
從Http 技術(shù)細(xì)節(jié)上講,就是 http request 頭中 有 "Accept-Encoding", "gzip" ,response 中就有返回頭Content-Encoding=gzip
我們現(xiàn)在從瀏覽器上訪問玩啥網(wǎng)站都是gzip格式傳輸?shù)摹?br />
但是我們現(xiàn)在Android 客戶端,沒有用gzip 格式訪問。
同樣的的道理,我們可以在android 客戶端 request 頭中加入 "Accept-Encoding", "gzip" ,來讓服務(wù)器傳送gzip 數(shù)據(jù)。
具體代碼如下。
private String getJsonStringFromGZIP(HttpResponse response) { String jsonString = null; try { InputStream is = response.getEntity().getContent(); BufferedInputStream bis = new BufferedInputStream(is); bis.mark(2); // 取前兩個(gè)字節(jié) byte[] header = new byte[2]; int result = bis.read(header); // reset輸入流到開始位置 bis.reset(); // 判斷是否是GZIP格式 int headerData = getShort(header); // Gzip 流 的前兩個(gè)字節(jié)是 0x1f8b if (result != -1 && headerData == 0x1f8b) { LogUtil.d("HttpTask", " use GZIPInputStream "); is = new GZIPInputStream(bis); } else { LogUtil.d("HttpTask", " not use GZIPInputStream"); is = bis; } InputStreamReader reader = new InputStreamReader(is, "utf-8"); char[] data = new char[100]; int readSize; StringBuffer sb = new StringBuffer(); while ((readSize = reader.read(data)) > 0) { sb.append(data, 0, readSize); } jsonString = sb.toString(); bis.close(); reader.close(); } catch (Exception e) { LogUtil.e("HttpTask", e.toString(),e); } LogUtil.d("HttpTask", "getJsonStringFromGZIP net output : " + jsonString ); return jsonString; } private int getShort(byte[] data) { return (int)((data[0]<<8) | data[1]&0xFF); }
參考 ,注意實(shí)際使用中,我發(fā)現(xiàn)gzip 流前兩個(gè)字節(jié)是0x1e8b ,不是0x1f8b .后來檢查一下code ,代碼處理錯(cuò)誤,加上第二個(gè)字節(jié)的時(shí)候需 &0xFF0x1f8b
可參考標(biāo)準(zhǔn)
http://www.gzip.org/zlib/rfc-gzip.html#file-format
http://xmagicj.diandian.com/post/2011-08-08/3641381
感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!
相關(guān)文章
Android Studio中生成aar文件及本地方式使用aar文件的方法
這篇文章給大家講解Android Studio中生成aar文件以及本地方式使用aar文件的方法,也就是說 *.jar 與 *.aar 的生成與*.aar導(dǎo)入項(xiàng)目方法,本文給大家介紹的非常詳細(xì),需要的朋友參考下吧2017-12-12Android 對手機(jī)網(wǎng)絡(luò)的檢測和監(jiān)聽的方法示例
本篇文章主要介紹了Android 對手機(jī)網(wǎng)絡(luò)的檢測和監(jiān)聽的方法示例,主要使用BroadcastReceiver廣播接收器來接收網(wǎng)絡(luò)狀態(tài),現(xiàn)在分享給大家,也給大家做個(gè)參考,有興趣的一起來了解一下2018-03-03Android中AutoCompleteTextView與MultiAutoCompleteTextView的用法
這篇文章主要介紹了Android中AutoCompleteTextView與MultiAutoCompleteTextView的用法,需要的朋友可以參考下2014-07-07Android軟鍵盤顯示模式及打開和關(guān)閉方式(推薦)
這篇文章主要介紹了Android軟鍵盤顯示模式及打開和關(guān)閉方式(推薦),非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2017-02-02Android原生ViewPager控件實(shí)現(xiàn)卡片翻動(dòng)效果
這篇文章主要為大家詳細(xì)介紹了Android原生ViewPager控件實(shí)現(xiàn)卡片翻動(dòng)效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-07-07Kotlin協(xié)程之Flow基礎(chǔ)原理示例解析
這篇文章主要為大家介紹了Kotlin協(xié)程之Flow基礎(chǔ)原理示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-09-09Android判斷當(dāng)前應(yīng)用程序處于前臺(tái)還是后臺(tái)的兩種方法
這篇文章主要介紹了Android判斷當(dāng)前應(yīng)用程序處于前臺(tái)還是后臺(tái)的兩種方法,有需要的朋友可以參考一下2013-12-12