AndroidHttp通訊 HTTP Client與HttpURLConnection的區別

lostinai發表於2014-05-23

Apache HTTP Client

        DefaultHttpClient 以及其相關類 AndroidHttpClient 適用於 web browsers, 他們是可擴充套件的,並且擁有大量的穩定APIs。

            但是,在不破壞其相容性的前提下很難對如此多的APIs做修改。因此,Android 團隊對修改優化Apache HTTP Client表現的並不積極。


HttpURLConnect

       HttpURLConnect 是一個通用的、適合大多數應用的輕量級元件。這個類起步比較晚,很容易在主要API上做穩步的改善。

       HttpURLConnection在Froyo上存在一些bug,尤其是在讀取 InputStream時呼叫 close()方法。解決這個bug,可參考如下程式碼:

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

       在GingerBread中,HttpURLConnection的報文頭中新增了對報文的壓縮處理,包括請求報文和回覆報文。

  1. Accept-Encoding: gzip  

       Web伺服器加上這個配置就可以支援報文的壓縮,如果響應時的壓縮產生問題,可參考doc文件關閉這個功能。

       HTTP的頭資訊的Content-Length返回的是壓縮後的大小,使用getContentLength()返回未壓縮位元組的大小。因此從響應資料讀取位元組直到 InputStream.read()返回-1,這樣可以獲取響應資料的大小。


       GingerBread的HTTPS也做了幾項改進,HttpsURLConnection能夠連線支援多個HTTPS主機共享一個 IP 的伺服器Server Name Indication (SNI)。它支援壓縮和session,如果連線失敗,他會取消壓縮和session屬性自動重連。這樣保證了HttpsURLConnection在支援老版本的前提下支援新的伺服器。


在Ice Cream Sandwich中,增加了快取機制,使用快取,HTTP requests需要滿足一下三種方式之一。

1、沒有網路連線時使用本地快取獲取響應。

2、比如,獲取一張圖片,客戶端發起請求,如果服務端沒有修改,則使用快取資料。

3、沒有及時的獲取到響應資料,可以使用快取。


       如果想使用早期的Android版本支援快取,可以使用java的反射機制。程式碼如下:


  1. private void enableHttpResponseCache() {  
  2.     try {  
  3.         long httpCacheSize = 10 * 1024 * 1024// 10 MiB  
  4.         File httpCacheDir = new File(getCacheDir(), "http");  
  5.         Class.forName("android.net.http.HttpResponseCache")  
  6.             .getMethod("install", File.classlong.class)  
  7.             .invoke(null, httpCacheDir, httpCacheSize);  
  8.     } catch (Exception httpResponseCacheNotAvailable) {  
  9.     }  
  10. }  


      你也應該配置Web伺服器支援快取屬性。


Which client is best?

        在Eclair 和 Froyo上Apache HTTP client擁有更少的bug,更好的穩定想,因此它是最好的選擇。

        在Gingerbread以及以後的版本中,HttpURLConnection是最好的選擇,它簡單的api以及輕量級非常適合Android。壓縮和快取機制降低了網路使用,提高了速度、節省了電量。新的應用應該選擇使用HttpURLConnection,我們也將做持續的改進。


原文地址:




相關文章