DefaultHttpClient 以及其相關類 AndroidHttpClient 適用於 web browsers, 他們是可擴展的,而且擁有大量的穩定APIs。html
可是,在不破壞其兼容性的前提下很難對如此多的APIs作修改。所以,Android 團隊對修改優化Apache HTTP Client表現的並不積極。java
HttpURLConnect 是一個通用的、適合大多數應用的輕量級組件。這個類起步比較晚,很容易在主要API上作穩步的改善。
android
HttpURLConnection在Froyo上存在一些bug,尤爲是在讀取 InputStream時調用 close()方法。解決這個bug,可參考以下代碼:
web
[java] view plaincopyprint?apache
private void disableConnectionReuseIfNecessary() { api
// HTTP connection reuse which was buggy pre-froyo 緩存
if (Integer.parseInt(Build.VERSION.SDK) < Build.VERSION_CODES.FROYO) { 服務器
System.setProperty("http.keepAlive", "false"); 網絡
} session
}
在GingerBread中,HttpURLConnection的報文頭中添加了對報文的壓縮處理,包括請求報文和回覆報文。
[java] view plaincopyprint?
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須要知足一下三種方式之一。
一、沒有網絡鏈接時使用本地緩存獲取響應。
二、好比,獲取一張圖片,客戶端發起請求,若是服務端沒有修改,則使用緩存數據。
三、沒有及時的獲取到響應數據,可使用緩存。
若是想使用早期的Android版本支持緩存,可使用java的反射機制。代碼以下:
[java] view plaincopyprint?
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服務器支持緩存屬性。
在Eclair 和 Froyo上Apache HTTP client擁有更少的bug,更好的穩定想,所以它是最好的選擇。
在Gingerbread以及之後的版本中,HttpURLConnection是最好的選擇,它簡單的api以及輕量級很是適合Android。壓縮和 緩存機制下降了網路使用,提升了速度、節省了電量。新的應用應該選擇使用HttpURLConnection,咱們也將作持續的改進。
原文地址:
http://android-developers.blogspot.com/2011/09/androids-http-clients.html
/**
* @author 張興業
* http://blog.csdn.net/xyz_lmn
* iOS入門羣:83702688
* android開發進階羣:241395671
* 個人新浪微博:@張興業TBOW
*/