在Android上使用Http用戶端的選擇(譯文)

來源:互聯網
上載者:User

   大多數有網路連接的Android應用會使用HTTP協議發送和接收資料。Android包含兩種Http用戶端類, HttpURLConnection和Apache HttpClient。這兩者都支援HTTPS,streaming 上傳與下載,配置逾時時間,IPv6, 以及串連池。

Apache Http Client

  DefaultHttpClient 和它的兄弟類AndroidHttpClient是適用於web瀏覽器的可擴充的Http用戶端。它們有大量的靈活的API,實現比較穩定,很少有bug。但是, 其龐大的API使我們很難去改進而不破壞其相容性。 Android團隊現在已不活躍與Apache HttpClient的工作上了。

HttpURLConnection

  HttpURLConnection是一個可以適用於各類應用的通用輕量級的Http用戶端。該類開始較為簡陋,但其關注的API讓我們容易平穩地改進它。 在Froyo(2.2)之前,HttpURLConnection有一些令人沮喪的的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(2.3),我們增加了透明的回應(response)壓縮。HttpURLConnection將自動地將“Accept-Encoding: gzip”頭欄位添加到請求(request)中,並處理相應的回應。 通過更改你的Web伺服器配置,實現對支援的用戶端返回壓縮後的資料。如果壓縮出了問題, 類文檔將提供關掉它的方法。

       由於HTTP的Content-Length頭欄位返回的是壓縮後的大小,使用getContentLength()去分配解壓縮後資料buffer 的大小就是錯誤的。 應該從response中讀位元組直到InputStream.read()傳回值為-1。

       我們還在Gingerbread上對HTTPS作出了一些改進。HttpsURLConnection嘗試以Server Name Indication(SNI)串連, SNI允許多個HTTPS host共用同一個IP地址。HttpsURLConnection也同樣可以使用壓縮和session ticket特性。,一旦串連失敗,它會自動不去使用這些特性重試。這使得HttpsURLConnection可以有效地串連最新的伺服器,同時不破壞對老舊伺服器的相容性。

  在Ice Cream Sandwich(4.0),我們增加了response cache。安裝了cache後,HTTP 請求以以下三種方式之一處理:

  完全的cache的response將直接從本機存放區中擷取。因為不需要網路連接,此類response可以立即得到。

  有條件cache的response必須在Web伺服器驗證一下cache的有效性。用戶端發送一個請求,比如“如果/foo.png從昨天起有變化則給我新的圖片” , 服務端的response要麼是更新後的內容,要麼是304 沒有修改狀態代碼。如果內容是沒有改變的,就不需要下載了。

  沒有cache的response將從伺服器上擷取。得到這些response之後會儲存到cache以便將來使用。

使用反射機制來使用Https response cache功能。以下範例程式碼將會在Ice Cream Sandwich上開啟response cache功能而不影響到之前的版本:

 

 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.class, long.class)
 7             .invoke(null, httpCacheDir, httpCacheSize);
 8     } catch (Exception httpResponseCacheNotAvailable) {
 9     }
10 }

 

  當然,你也需要更改你的Web伺服器配置,在其Http response中設定cache頭欄位。

哪一種http用戶端最好?

  Apache HTTP client在Eclair(2.1)和Froyo(2.2)上bug更少,在這些系統版本上將是最佳選擇。

       從Gingerbread(2.3)起,HttpURLConnection將是最佳選擇,其API簡單,小巧,非常適合於Android。透明的壓縮及response cache減少了網路流量,改進了網路速度,也就更省電。 新的應用將應該使用HttpURLConnection, 這是我們以後花費精力去探索的地方。


轉自:http://www.cnblogs.com/mudoot/archive/2011/11/30/android_http_clients.html

=================================================================
著作權共同維護,如需轉載,請註明轉載地址。

當前部落格原始地址:wisekingokok.cnblogs.com
=================================================================

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.