安卓應用的HTTP請求方式:Apache HTTP Client和HttpURLConnection

原文鏈接:Android’s HTTP Clients

  Android平臺上的大多數聯網應用都使用HTTP來發送和接收數據。Android平臺包括兩種HTTP client:HttpURLConnection和Apache HTTP Client。兩者都支持HTTPS、流上傳/下載、超時時間設置、IPV6及連接池。

Apache HTTP Client

  DefaultHttpClient及 AndroidHttpClient都是針對Web瀏覽器的可擴展的HTTP clients。它們擁有數量龐大大且靈活的API,而且它們的實現都比較穩定,但是都有一些bug。

  不過,由於它們數量龐大的API導致我們無法在不破壞它們兼容性的情況下改進它們。所以Android開發團隊並不熱衷於Apache HTTP Client。

HttpURLConnection

  HttpURLConnection是一個針對一般用途的輕量級的HTTP client,並適用於大多數Android應用。這個類有一個比較低調的開始,不過它特別關注的那些API使我們可以簡單、穩定的改進它。

  在Froyo(Android2.2)版本之前,HttpURLConnection有一些讓人十分沮喪的bugs。特別是當我們在一個可讀的InputStream上調用close()時,會破壞連接池。我們可以通過禁用連接池來規避這個問題(代碼如下):

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

  在Gingerbread(Android2.3)中,我們新增了透明的相應壓縮(原文是:we added transparent response compression.哪位大神知道正確翻譯是啥的話,幫忙提醒下 -。-)。HttpURLConnection 會自動在它發出的請求中添加一個header,並且會處理對應的響應。

 Accept-Encoding: gzip

  你可以通過配置你的Web服務器來壓縮返回給客戶端的響應,從而利用該新特性。如果壓縮後的響應有異常,可以在這個類的api文檔中查看如何禁用該特性。

  儘管HTTP的Content-Length頭中返回了壓縮後的大小,但是使用getContentLength()的返回值來設定那些未壓縮數據的buffer是一個錯誤。因此,我們應該從響應中讀取每一個字節直到InputStream.read()返回-1。

在Gingerbread(Android2.3)中,我們還針對HTTPS做了一些提升。HttpURLConnection嘗試與 Server Name Indication (SNI)進行互聯,這是一種允許多個HTTPS host共享一個IP地址的技術。同時還使用壓縮及session tickets。假如HttpURLConnection連接失敗,HttpURLConnection會去掉以上特性後自動嘗試重新連接。這使得HttpURLConnection在不破壞與舊的server兼容性的情況下,連接up-to-date servers更高效。

 在Ice Cream Sandwich(Android4.0)中,我們正在添加一個response cache。應用這個特性,HTTP請求會以下列三種情況被響應:
  1、完全緩存的響應,直接從本地獲取。這種狀況下完全不需要聯網,並且可以立即響應。
  2、有條件的被緩存的響應,這些緩存是否需要刷新需要從服務器確認。客戶端發送一個類似“昨天以來,如果foo.png發生過變動,就給我一個新的”這樣的請求,服務器會返回一個新的圖片或者一個304 Not Modified狀態嗎給客戶端。假如請求的內容沒有變動,則內容不會被再次下載。
  3、沒有緩存的響應,從服務器獲取。這種響應會被緩存起來以備以後使用。

  可以通過反射來開啓那些支持緩存HTTP響應的設備上的緩存功能。下面的代碼演示瞭如何在不影響Ice Cream Sandwich(Android4.0)以前的版本的情況下開啓緩存功能。

  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響應的頭中設置與緩存相關的內容。

  什麼是最好的HTTP client

   在Froyo(Android2.2)及更早期的版本中,Apache HTTP client相對於HttpURLConnection 擁有更少的bug。所以這種情況下Apache HTTP clien是最好的選擇。

   從Gingerbread(Android2.3)開始,HttpURLConnection則是最好的選擇。它簡單的API和比較小的體積使他更適合Android。Transparent compression和響應緩存則減少了網絡使用,提升了加載速度和電池性能。新的應用應該使用HttpURLConnection,同時HttpURLConnection也是我們以後的工作重心所在。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章