android中g(shù)zip數(shù)據(jù)壓縮與網(wǎng)絡(luò)框架解壓縮
theme: smartblue
gzip是一種常用的壓縮算法,它是若干種文件壓縮程序的簡(jiǎn)稱,通常指GNU計(jì)劃的實(shí)現(xiàn),此處的gzip代表GNU zip。
HTTP協(xié)議上的GZIP編碼是一種用來(lái)改進(jìn)WEB應(yīng)用程序性能的技術(shù)。大流量的WEB站點(diǎn)常常使用GZIP壓縮技術(shù)來(lái)讓用戶感受更快的速度。
開(kāi)GZIP有什么好處?
Gzip開(kāi)啟以后會(huì)將輸出到用戶瀏覽器的數(shù)據(jù)進(jìn)行壓縮的處理,這樣就會(huì)減小通過(guò)網(wǎng)絡(luò)傳輸?shù)臄?shù)據(jù)量,提高瀏覽的速度。
Java中g(shù)zip壓縮和解壓實(shí)現(xiàn)
字節(jié)流壓縮:
/**
* 字節(jié)流gzip壓縮
* @param data
* @return
*/
public static byte[] gZip(byte[] data) {
byte[] b = null;
try {
ByteArrayInputStream in = new ByteArrayInputStream(data);
ByteArrayOutputStream out = new ByteArrayOutputStream();
GZIPOutputStream gzip = new GZIPOutputStream(out);
byte[] buffer = new byte[4096];
int n = 0;
while((n = in.read(buffer, 0, buffer.length)) > 0){
gzip.write(buffer, 0, n);
}
gzip.close();
in.close();
b = out.toByteArray();
out.close();
} catch (Exception ex) {
ex.printStackTrace();
}
return b;
}
字節(jié)流解壓:
/**
* gzip解壓
* @param data
* @return
*/
public static byte[] unGZip(byte[] data){
// 創(chuàng)建一個(gè)新的輸出流
ByteArrayOutputStream out = new ByteArrayOutputStream();
try {
ByteArrayInputStream in = new ByteArrayInputStream(data);
GZIPInputStream gzip = new GZIPInputStream(in);
byte[] buffer = new byte[4096];
int n = 0;
// 將解壓后的數(shù)據(jù)寫(xiě)入輸出流
while ((n = gzip.read(buffer)) >= 0) {
out.write(buffer, 0, n);
}
in.close();
gzip.close();
out.close();
} catch (Exception e) {
e.printStackTrace();
}
return out.toByteArray();
}
網(wǎng)絡(luò)框架解壓縮(gzip)
一、采用內(nèi)存數(shù)據(jù)庫(kù)保存記錄。
二、請(qǐng)求時(shí)采用重新開(kāi)新線程方式,在子線程中請(qǐng)求網(wǎng)絡(luò)請(qǐng)求。
三、數(shù)據(jù)請(qǐng)求后,可通過(guò)EventBus來(lái)設(shè)置返回結(jié)果的參數(shù)和返回信息,若其它類需要獲取狀態(tài)時(shí),需要自己注冊(cè)監(jiān)聽(tīng),動(dòng)態(tài)去獲取返回值。
使用場(chǎng)景:應(yīng)用程序內(nèi)各組件間、組件與后臺(tái)線程間的通信。
比如請(qǐng)求網(wǎng)絡(luò),等網(wǎng)絡(luò)返回時(shí)通過(guò)Handler或Broadcast通知UI,兩個(gè)Fragment之間需要通過(guò)Listener通信,這些需求都可以通過(guò)EventBus實(shí)現(xiàn)。
使用步驟:
? \1. 添加依賴:implementation 'org.greenrobot:eventbus:3.0.0' ? \2. 注冊(cè):EventBus.getDefault().register(this); ?
構(gòu)造消息發(fā)送類(post調(diào)用的對(duì)象)
public class Student {
private String name;
private int age;
?
public Student(String name, int age) {
this.name = name;
this.age = age;
}
public void setName(String name) {
this.name = name;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
}
發(fā)布消息
EventBus.getDefault().post(new Student("劉哈哈", 27));
接收消息:可以有四種線程模型選擇
//接收事件
@Subscribe(threadMode = ThreadMode.MAIN)
public void studentEventBus(Student student){
mShow.setText("姓名:"+student.getName()+" "+"年齡:"+student.getAge());
}
解注冊(cè)(防止內(nèi)存泄漏):EventBus.getDefault().unregister(this);
網(wǎng)絡(luò)請(qǐng)求成功后,需要注意文件流的大小,太大容易下載緩慢,解決緩慢問(wèn)題
1、JSON返回格式,盡量去KEY,將JSONOBJECT修改為JSONArray格式。
2、對(duì)數(shù)據(jù)進(jìn)行壓縮,采用GZIP對(duì)數(shù)據(jù)進(jìn)行壓縮處理:網(wǎng)絡(luò)請(qǐng)求時(shí)服務(wù)器對(duì)數(shù)據(jù)壓縮,移動(dòng)端請(qǐng)求到結(jié)果后,再進(jìn)行解壓。

文末
在網(wǎng)絡(luò)傳輸中我們一般都會(huì)開(kāi)啟GZIP壓縮,但是出于刨根問(wèn)底的天性僅僅知道如何開(kāi)啟就不能滿足俺的好奇心的,所以想著寫(xiě)個(gè)demo測(cè)試一下比較常用的兩個(gè)數(shù)據(jù)壓縮方式,GZIP/ZIP壓縮。
GZIP是網(wǎng)站壓縮加速的一種技術(shù),對(duì)于開(kāi)啟后可以加快我們網(wǎng)站的打開(kāi)速度,原理是經(jīng)過(guò)服務(wù)器壓縮,客戶端瀏覽器快速解壓的原理,可以大大減少了網(wǎng)站的流量。
以上就是android中g(shù)zip數(shù)據(jù)壓縮與網(wǎng)絡(luò)框架解壓縮的詳細(xì)內(nèi)容,更多關(guān)于android gzip數(shù)據(jù)壓縮解壓縮的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Android通過(guò)手機(jī)拍照或從本地相冊(cè)選取圖片設(shè)置頭像
微信、QQ、微博等社交類APP如何更換自己的頭像,這篇文章主要介紹了Android通過(guò)手機(jī)拍照或從本地相冊(cè)選取圖片設(shè)置頭像,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-07-07
Android布局之RelativeLayout相對(duì)布局
RelativeLayout是相對(duì)布局控件:以控件之間相對(duì)位置或相對(duì)父容器位置進(jìn)行排列,下面通過(guò)本文給大家介紹Android布局之RelativeLayout相對(duì)布局,涉及到android relativelayout相對(duì)布局相關(guān)知識(shí),對(duì)android relativelayout相對(duì)布局相關(guān)知識(shí),感興趣的朋友一起學(xué)習(xí)吧2015-12-12
Android 獲取屏幕高度,標(biāo)題高度,狀態(tài)欄高度(實(shí)例代碼)
getWindow().findViewById(Window.ID_ANDROID_CONTENT)這個(gè)方法獲取到的view就是程序不包括標(biāo)題欄的部分,然后就可以知道標(biāo)題欄的高度了2013-11-11
android檢測(cè)網(wǎng)絡(luò)連接狀態(tài)示例講解
網(wǎng)絡(luò)的時(shí)候,并不是每次都能連接到網(wǎng)絡(luò),因此在程序啟動(dòng)中需要對(duì)網(wǎng)絡(luò)的狀態(tài)進(jìn)行判斷,如果沒(méi)有網(wǎng)絡(luò)則提醒用戶進(jìn)行設(shè)置2014-02-02
Android 自定義View手寫(xiě)簽名并保存圖片功能
這篇文章主要介紹了Android 自定義View手寫(xiě)簽名并保存圖片功能,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值 ,需要的朋友可以參考下2020-03-03
Android中ViewPager你所不知道的優(yōu)化技巧分享
提到ViewPager想必各位同學(xué)一點(diǎn)都不陌生,它是Android中最常用的組件之一,這篇文章小編就帶大家一起來(lái)看看ViewPager一些新的優(yōu)化方式吧2024-04-04
Android中findViewById獲取控件返回為空問(wèn)題怎么解決
這篇文章主要介紹了Android中findViewById獲取控件返回為空問(wèn)題怎么解決的相關(guān)資料,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2016-06-06

