HttpClient vs HttpURLConnection

大多數(shù)Android應(yīng)用都需要連接網(wǎng)絡(luò),使用HTTP來發(fā)送和接收數(shù)據(jù)溃睹。Android包含兩種HTTP客戶端:HttpURLConnection和Apache HTTP Client褥琐。它們都支持HTTPS状飞,流的上傳和下載商玫,超時(shí)配置疹娶,IPv6和連接池伴栓。

Apache HTTP客戶端

DefaultHttpClient和AndroidHttpClient都是適用于web瀏覽器的可擴(kuò)展HTTP客戶端。它們有大量的雨饺、靈活的API钳垮。它們的實(shí)現(xiàn)穩(wěn)定惜姐,幾乎沒有bug榕订。

但是大數(shù)量的API使得我們很難在不破壞兼容性的情況下對(duì)其改善,同時(shí)Google的Android團(tuán)隊(duì)沒有積極致力于Apache HTTP客戶端沈矿。

HttpURLConnection

HttpURLConnection是一個(gè)通用的移斩、輕量的肚医、適用于大多數(shù)應(yīng)用的HTTP客戶端绢馍。它的API量少,但主要的API使得我們可以穩(wěn)固地進(jìn)行改善肠套。

在Froyo之前舰涌,HttpURLConnection有一些令人沮喪的bug。尤其在一個(gè)可讀輸入流時(shí)調(diào)用close()會(huì)污染連接池你稚。通過禁用連接池來解決這個(gè)問題:

private void disableConnectionReuseIfNecessary() {
    // HTTP connection reuse which was buggy pre-froyo
    if (Integer.parseInt(Build.VERSION.SDK < Build.VERSION_CODES.FROYO) {
        System.setProperty("http.keepAlive", "false");
    }
}

在Gingerbread瓷耙,添加了透明響應(yīng)壓縮。HttpURLConnection會(huì)自動(dòng)添加下面的header到發(fā)出的請(qǐng)求中入宦,并且處理相應(yīng)的響應(yīng):

Accept-Encoding: gzipf

使用這個(gè)需要配置Web服務(wù)器來對(duì)客戶端進(jìn)行壓縮響應(yīng)哺徊。

由于HTTP的Content-Length頭返回壓縮的大小,因此使用getContentLength()來給未壓縮數(shù)據(jù)定義緩存大小是錯(cuò)誤的乾闰,而應(yīng)該從響應(yīng)中讀取字節(jié)直到InputStream.read()返回-1落追。

在Gingerbread中做了些關(guān)于HTTPS的提升。HttpsURLConnection嘗試連接Server Name Indication(SNI:允許多個(gè)HTTPS hosts共享一個(gè)IP地址)涯肩。它同時(shí)啟用了壓縮和會(huì)話許可證轿钠。如果連接失敗,它會(huì)自動(dòng)不用這些特性嘗試病苗。這樣使得當(dāng)連接最新的服務(wù)器時(shí)HttpsURLConnection有效率疗垛,而不會(huì)破壞之前的兼容性。

在Ice Cream Sandwich硫朦,添加了一個(gè)響應(yīng)緩存贷腕。當(dāng)緩存建立了,HTTP請(qǐng)求將會(huì)是以下三種方式中的一種:

  • 所有緩存響應(yīng)將會(huì)直接從本地存儲(chǔ)獲取服務(wù)咬展。因?yàn)闆]有網(wǎng)絡(luò)連接需要建立泽裳,響應(yīng)可以立即可用。
  • 有條件地緩存響應(yīng)必須通過webserver有它們的刷新有效期破婆′套埽客戶端發(fā)送一個(gè)請(qǐng)求“Give me /foo.png if it changed since yesterday”,然后服務(wù)器用更新后的內(nèi)容或者一個(gè)304 Not Modified狀態(tài)回復(fù)祷舀。如果內(nèi)容沒有改變將不會(huì)進(jìn)行下載瀑梗。
  • 未緩存響應(yīng)將會(huì)從網(wǎng)絡(luò)獲取服務(wù)。這些響應(yīng)將會(huì)在之后存儲(chǔ)在響應(yīng)緩存中裳扯。

使用反射來在支持的設(shè)備上啟用HTTP響應(yīng)緩存抛丽。下面是示例代碼來在Ice Cream Sandwich上打開響應(yīng)緩存而不影響之前的版本:

private void enableHttpResponseCache() {
    try {
        long httpCacheSize = 10 * 1024 * 1024; // 10 MiB
        File httpCacheDir = new File(getCacheDir(), "http");
        Class.forName("android.net.http.HttpResponseCache")
            .getMethod("install", File.class, long.class)
            .invoke(null, httpCacheDir, httpCacheSize);
    } catch (Exception httpResponseCacheNotAvailable) {
    }
}

也應(yīng)該配置Web Server來在HTTP響應(yīng)上設(shè)置緩存頭。

哪個(gè)客戶端是最好的饰豺?

Apache HTTP客戶端在Eclair和Froyo上幾乎沒有bug亿鲜,它是這些版本的最好選擇。

對(duì)于Gingerbread和之后的版本哟忍,HttpURLConnection是最好的選擇狡门,它簡(jiǎn)單的API和小體積使得很適合Android。透明壓縮和響應(yīng)緩存減少了網(wǎng)絡(luò)流量锅很,提升了速度其馏,節(jié)省了電池。

原文鏈接:
http://android-developers.blogspot.com/2011/09/androids-http-clients.html


Http客戶端的相關(guān)故事

  1. android-async-http內(nèi)部實(shí)現(xiàn)基于HttpClient爆安。
  2. Volley在Gingerbread及之上使用HttpURLConnection叛复,其他情況使用的HttpClient。
  3. Google在Android 6.0版本刪除了HttpClient相關(guān)API扔仓。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末褐奥,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子翘簇,更是在濱河造成了極大的恐慌撬码,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,888評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件版保,死亡現(xiàn)場(chǎng)離奇詭異呜笑,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)彻犁,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,677評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門叫胁,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人汞幢,你說我怎么就攤上這事驼鹅。” “怎么了森篷?”我有些...
    開封第一講書人閱讀 168,386評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵输钩,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我疾宏,道長(zhǎng)张足,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,726評(píng)論 1 297
  • 正文 為了忘掉前任坎藐,我火速辦了婚禮为牍,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘岩馍。我一直安慰自己碉咆,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,729評(píng)論 6 397
  • 文/花漫 我一把揭開白布蛀恩。 她就那樣靜靜地躺著疫铜,像睡著了一般。 火紅的嫁衣襯著肌膚如雪双谆。 梳的紋絲不亂的頭發(fā)上壳咕,一...
    開封第一講書人閱讀 52,337評(píng)論 1 310
  • 那天席揽,我揣著相機(jī)與錄音,去河邊找鬼谓厘。 笑死幌羞,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的竟稳。 我是一名探鬼主播属桦,決...
    沈念sama閱讀 40,902評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼他爸!你這毒婦竟也來了聂宾?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,807評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤诊笤,失蹤者是張志新(化名)和其女友劉穎系谐,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體盏混,經(jīng)...
    沈念sama閱讀 46,349評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡蔚鸥,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,439評(píng)論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了许赃。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片止喷。...
    茶點(diǎn)故事閱讀 40,567評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖混聊,靈堂內(nèi)的尸體忽然破棺而出弹谁,到底是詐尸還是另有隱情,我是刑警寧澤句喜,帶...
    沈念sama閱讀 36,242評(píng)論 5 350
  • 正文 年R本政府宣布预愤,位于F島的核電站,受9級(jí)特大地震影響咳胃,放射性物質(zhì)發(fā)生泄漏植康。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,933評(píng)論 3 334
  • 文/蒙蒙 一展懈、第九天 我趴在偏房一處隱蔽的房頂上張望销睁。 院中可真熱鬧,春花似錦存崖、人聲如沸冻记。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,420評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽冗栗。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間隅居,已是汗流浹背钠至。 一陣腳步聲響...
    開封第一講書人閱讀 33,531評(píng)論 1 272
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留胎源,地道東北人棕洋。 一個(gè)月前我還...
    沈念sama閱讀 48,995評(píng)論 3 377
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像乒融,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子摄悯,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,585評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,302評(píng)論 25 707
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理赞季,服務(wù)發(fā)現(xiàn),斷路器奢驯,智...
    卡卡羅2017閱讀 134,702評(píng)論 18 139
  • 轉(zhuǎn)自: Android4種網(wǎng)絡(luò)連接方式HttpClient、HttpURLConnection管跺、OKHttp和V...
    yabin小站閱讀 5,290評(píng)論 0 40
  • 今天早早的起床义黎,來到了店里。好長(zhǎng)時(shí)間沒回家豁跑,對(duì)家已很陌生了廉涕。我知道我與家人的距離。我在追溯過往經(jīng)歷中發(fā)現(xiàn)了自己的卡...
    王澤華wzhwzh閱讀 145評(píng)論 0 0
  • 中秋節(jié)來了艇拍,那天早上先背書狐蜕,寫了一些作業(yè)。然后去香辣蝦店吃中午飯卸夕。去沃爾瑪超市購物层释,看到了書本,原本要購物的我去讀...
    楊斯茹閱讀 250評(píng)論 0 0