Android訪問網路,使用HttpURLConnection還是HttpClient?

來源:互聯網
上載者:User

標籤:

最近在研究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協議、以流的形式進行上傳和下載、配置逾時時間、IPv6、以及串連池等功能。

HttpClient

DefaultHttpClient和它的兄弟AndroidHttpClient都是HttpClient具體的實作類別,它們都擁有眾多的API,而且實現比較穩定,bug數量也很少。

但同時也由於HttpClient的API數量過多,使得我們很難在不破壞相容性的情況下對它進行升級和擴充,所以目前Android團隊在提升和最佳化HttpClient方面的工作態度並不積極。

HttpURLConnection

HttpURLConnection是一種多用途、輕量極的HTTP用戶端,使用它來進行HTTP操作可以適用於大多數的應用程式。雖然HttpURLConnection的API提供的比較簡單,但是同時這也使得我們可以更加容易地去使用和擴充它。

不過在Android 2.2版本之前,HttpURLConnection一直存在著一些令人厭煩的bug。比如說對一個可讀的InputStream調用close()方法時,就有可能會導致串連池失效了。那麼我們通常的解決辦法就是直接禁用掉串連池的功能:

123456 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及以後的版本中去啟用響應緩衝的功能,同時還不會影響到之前的版本:

12345678910 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.classlong.class)                       .invoke(null, httpCacheDir, httpCacheSize);      catch (Exception httpResponseCacheNotAvailable) {      }}

你也應該同時配置一下你的Web伺服器,在HTTP響應上加入緩衝的訊息頭。

哪一種才是最好的?

在Android 2.2版本之前,HttpClient擁有較少的bug,因此使用它是最好的選擇。

而在Android 2.3版本及以後,HttpURLConnection則是最佳的選擇。它的API簡單,體積較小,因而非常適用於Android項目。壓縮和緩衝機制可以有效地減少網路訪問的流量,在提升速度和省電方面也起到了較大的作用。對於新的應用程式應該更加偏向於使用HttpURLConnection,因為在以後的工作當中我們也會將更多的時間放在最佳化HttpURLConnection上面。

本文轉自:http://blog.csdn.net/guolin_blog/article/details/12452307

Android訪問網路,使用HttpURLConnection還是HttpClient?

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.