AndroidHttp通訊 HTTP Client與HttpURLConnection的區別
Apache HTTP Client
DefaultHttpClient 以及其相關類 AndroidHttpClient 適用於 web browsers, 他們是可擴充套件的,並且擁有大量的穩定APIs。
但是,在不破壞其相容性的前提下很難對如此多的APIs做修改。因此,Android 團隊對修改優化Apache HTTP Client表現的並不積極。
HttpURLConnect
HttpURLConnect 是一個通用的、適合大多數應用的輕量級元件。這個類起步比較晚,很容易在主要API上做穩步的改善。
HttpURLConnection在Froyo上存在一些bug,尤其是在讀取 InputStream時呼叫 close()方法。解決這個bug,可參考如下程式碼:
- 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中,HttpURLConnection的報文頭中新增了對報文的壓縮處理,包括請求報文和回覆報文。
- 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的反射機制。程式碼如下:
- 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伺服器支援快取屬性。
Which client is best?
相關文章
- 序列通訊與並行通訊的區別並行
- 【通訊】TETRA 與PDT的區別
- socket與http的區別HTTP
- 物聯網通訊與普通簡訊通訊的區別和要注意的地方
- HTTP 2.0與HTTP 1.1區別HTTP
- 網路通訊——socket(TCP/IP).Http,同步和非同步的區別TCPHTTP非同步
- http與https的區別HTTP
- HTTP 與 HTTPS 的區別HTTP
- ROS話題通訊和服務通訊的區別ROS
- Yarn-cluster 與 Yarn-client的區別Yarnclient
- 樂訊通雲通訊:物聯網路卡與手機卡區別
- HTTP與UDP/TCP區別HTTPUDPTCP
- HTTP中GET與POST的區別HTTP
- http1.0與http1.1的區別(轉)HTTP
- HTTP通訊HTTP
- HTTP發展史,HTTP1.1與HTTP2.0的區別HTTP
- WebSocket於HTTP 、WebSocket與Socket的區別WebHTTP
- HTTP代理與SOCKS代理的主要區別HTTP
- Http中header與body的區別HTTPHeader
- HTTP、HTTP1.1、HTTP/2的區別HTTP
- 淺談HTTP中Get與Post的區別HTTP
- Bold訊號與fNIRS訊號的區別
- Go的http clientGoHTTPclient
- HTTP vs HTTPS: 網路通訊的加密之爭!你真的知道它們的區別嗎?HTTP加密
- HTTP協議的通訊框架HTTP協議框架
- http通訊類的封裝HTTP封裝
- 樂訊通雲通訊:物聯網路卡和手機卡的區別
- HTTP通訊協議HTTP協議
- http與https的區別我真的知道嗎HTTP
- 淺談HTTP中Get與Post的區別-javaHTTPJava
- SOCKS代理與HTTP代理主要區別分析HTTP
- 實現客戶端與服務端的HTTP通訊客戶端服務端HTTP
- HTTp和ftp的區別HTTPFTP
- TCP/IP、Http的區別TCPHTTP
- tcp和http的區別TCPHTTP
- websocket和http的區別WebHTTP
- Nginx的HTTP模組與Stream模組:區別與應用場景NginxHTTP
- TCP、UDP、HTTP、SOCKET之間的區別與聯絡TCPUDPHTTP