Android GZip的使用-開(kāi)發(fā)中網(wǎng)絡(luò)請(qǐng)求的壓縮實(shí)例詳解
Android GZip:
gzip是GNUzip的縮寫(xiě),它是一個(gè)GNU自由軟件的文件壓縮程序。
HTTP協(xié)議上的GZIP編碼是一種用來(lái)改進(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èn)玩啥網(wǎng)站都是gzip格式傳輸?shù)摹?br />
但是我們現(xiàn)在Android 客戶端,沒(méi)有用gzip 格式訪問(wèn)。
同樣的的道理,我們可以在android 客戶端 request 頭中加入 "Accept-Encoding", "gzip" ,來(lái)讓服務(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輸入流到開(kāi)始位置
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 .后來(lái)檢查一下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
感謝閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持!
相關(guān)文章
android View 繪制完成監(jiān)聽(tīng)的實(shí)現(xiàn)方法
今天小編就為大家分享一篇android View 繪制完成監(jiān)聽(tīng)的實(shí)現(xiàn)方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-09-09
Flutter進(jìn)階之實(shí)現(xiàn)動(dòng)畫(huà)效果(三)
這篇文章主要為大家詳細(xì)介紹了Flutter進(jìn)階之實(shí)現(xiàn)動(dòng)畫(huà)效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-08-08
Android實(shí)現(xiàn)Ant Design 自定義表單組件
Ant Design 組件提供了Input,InputNumber,Radio,Select,uplod等表單組件,下面通過(guò)本文給大家詳細(xì)介紹Android實(shí)現(xiàn)Ant Design 自定義表單組件,需要的的朋友參考下吧2017-06-06
Android usb設(shè)備權(quán)限查詢(xún)及自動(dòng)獲取詳解流程
本篇文章介紹了我想要獲取Android系統(tǒng)usb設(shè)備使用權(quán)限時(shí)遇到的問(wèn)題,以及解決該問(wèn)題的過(guò)程及思路,通讀本篇對(duì)大家的學(xué)習(xí)或工作具有一定的價(jià)值,需要的朋友可以參考下2021-10-10
Android使用Pull解析器解析xml文件的實(shí)現(xiàn)代碼
Android使用Pull解析器解析xml文件的實(shí)現(xiàn)代碼,需要的朋友可以參考一下2013-02-02
總結(jié)Android中多線程更新應(yīng)用的頁(yè)面信息的方式
這篇文章主要介紹了總結(jié)Android中多線程更新應(yīng)用的頁(yè)面信息的方式,文中共總結(jié)了runOnUiThread、Handler、AsyncTask異步以及View直接在UI線程中更新的方法,需要的朋友可以參考下2016-02-02
Android自定義定時(shí)鬧鐘開(kāi)發(fā)
這篇文章主要為大家詳細(xì)介紹了Android自定義定時(shí)鬧鐘開(kāi)發(fā),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-09-09
Android?Flutter實(shí)現(xiàn)精靈圖的使用詳解
在游戲開(kāi)發(fā)中,精靈圖會(huì)將一個(gè)人物所有動(dòng)作放置在一張圖片中,通過(guò)坐標(biāo)定位選取其中一張圖展示。本文就來(lái)教你如何使用精靈圖,感興趣的可以了解一下2022-08-08
簡(jiǎn)單實(shí)現(xiàn)Android驗(yàn)證碼
在登錄或者注冊(cè)的時(shí)候要求輸入驗(yàn)證碼,這篇文章主要為大家詳細(xì)介紹了如何簡(jiǎn)單實(shí)現(xiàn)Android驗(yàn)證碼的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-12-12

