[Android]HttpClient和HttpURLConnection的區別

轉載:http://blog.csdn.net/guolin_blog/article/details/12452307
最近在研究Volley框架的源碼,發現它在HTTP請求的使用上比較有意思,在Android 2.3及以上版本,使用的是HttpURLConnection,而在Android 2.2及如下版本,使用的是HttpClient。我也比較好奇這麼使用的緣由,因而專門找到了一位Google的工程師寫的一篇博客,文中對HttpURLConnection和HttpClient進行了對比,下面我就給你們簡要地翻譯一下。
原文地址:http://android-developers.blogspot.com/2011/09/androids-http-clients.html
大多數的Android應用程序都會使用HTTP協議來發送和接收網絡數據,而Android中主要提供了兩種方式來進行HTTP操做,HttpURLConnection和HttpClient。這兩種方式都支持HTTPS協議、以流的形式進行上傳和下載、配置超時時間、IPv六、以及鏈接池等功能。html

HttpClient

DefaultHttpClient和它的兄弟AndroidHttpClient都是HttpClient具體的實現類,它們都擁有衆多的API,並且實現比較穩定,bug數量也不多。
但同時也因爲HttpClient的API數量過多,使得咱們很難在不破壞兼容性的狀況下對它進行升級和擴展,因此目前Android團隊在提高和優化HttpClient方面的工做態度並不積極。android

HttpURLConnection

HttpURLConnection是一種多用途、輕量極的HTTP客戶端,使用它來進行HTTP操做能夠適用於大多數的應用程序。雖然HttpURLConnection的API提供的比較簡單,可是同時這也使得咱們能夠更加容易地去使用和擴展它。
不過在Android 2.2版本以前,HttpURLConnection一直存在着一些使人厭煩的bug。好比說對一個可讀的InputStream調用close()方法時,就有可能會致使鏈接池失效了。那麼咱們一般的解決辦法就是直接禁用掉鏈接池的功能:緩存

private void disableConnectionReuseIfNecessary() {  
    // 這是一個2.2版本以前的bug  
    if (Integer.parseInt(Build.VERSION.SDK) < Build.VERSION_CODES.FROYO) {  
        System.setProperty("http.keepAlive", "false");  
    }  
}

在Android 2.3版本的時候,咱們加入了更加透明化的響應壓縮。HttpURLConnection會自動在每一個發出的請求中加入以下消息頭,並處理相應的返回結果:
Accept-Encoding: gzip服務器

配置你的Web服務器來支持對客戶端的響應進行壓縮的功能,從而能夠在這一改進上獲取到最大的好處。若是在壓縮響應的時候出現了問題,這篇文檔會告訴你如何禁用掉這個功能。網絡

可是若是啓動了響應壓縮的功能,HTTP響應頭裏的Content-Length就會表明着壓縮後的長度,這時再使用getContentLength()方法來取出解壓後的數據就是錯誤的了。正確的作法應該是一直調用InputStream.read()方法來讀取響應數據,一直到出現-1爲止。框架

咱們在Android 2.3版本中還增長了一些HTTPS方面的改進,如今HttpsURLConnection會使用SNI(Server Name Indication)的方式進行鏈接,使得多個HTTPS主機能夠共享同一個IP地址。除此以外,還增長了一些壓縮和會話的機制。若是鏈接失敗,它會自動去嘗試從新進行鏈接。這使得HttpsURLConnection能夠在不破壞老版本兼容性的前提下,更加高效地鏈接最新的服務器。優化

在Android 4.0版本中,咱們又添加了一些響應的緩存機制。當緩存被安裝後(調用HttpResponseCache的install()方法),全部的HTTP請求都會知足如下三種狀況:
全部的緩存響應都由本地存儲來提供。由於沒有必要去發起任務的網絡鏈接請求,全部的響應均可以馬上獲取到。
視狀況而定的緩存響應必需要有服務器來進行更新檢查。好比說客戶端發起了一條相似於 「若是/foo.png這張圖片發生了改變,就將它發送給我」 這樣的請求,服務器須要將更新後的數據進行返回,或者返回一個304 Not Modified狀態。若是請求的內容沒有發生,客戶端就不會下載任何數據。
沒有緩存的響應都是由服務器直接提供的。這部分響應會在稍後存儲到響應緩存中。
因爲這個功能是在4.0以後的版本纔有的,一般咱們就可使用反射的方式來啓動響應緩存功能。下面的示例代碼展現瞭如何在Android 4.0及之後的版本中去啓用響應緩存的功能,同時還不會影響到以前的版本:ui

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) {  
    }  
}

你也應該同時配置一下你的Web服務器,在HTTP響應上加入緩存的消息頭。url

哪種纔是最好的?

在Android 2.2版本以前,HttpClient擁有較少的bug,所以使用它是最好的選擇。
而在Android 2.3版本及之後,HttpURLConnection則是最佳的選擇。它的API簡單,體積較小,於是很是適用於Android項目。壓縮和緩存機制能夠有效地減小網絡訪問的流量,在提高速度和省電方面也起到了較大的做用。對於新的應用程序應該更加偏向於使用HttpURLConnection,由於在之後的工做當中咱們也會將更多的時間放在優化HttpURLConnection上面。.net

相關文章
相關標籤/搜索