大多數有網路連接的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
=================================================================