閱讀513 返回首頁    go 阿裏雲 go 技術社區[雲棲]


android中httpclient和HttpURLConnection優缺點和常見bug解決方法

https://blog.csdn.net/androidzhaoxiaogang/article/details/8158122

官方意見:

1) apache httpclient比較穩定點,少BUG,但由於API的關係,擴展改造麻煩點,
所以android team現在不鳥這東西了基本

2) httpurlconnection比較輕便,靈活,易於擴展,在2。2前有個BUG,
見https://code.google.com/p/android/issues/detail?id=2939
  可以通過如下代碼去解決:
 

[java] view plaincopy
  1. private void disableConnectionReuseIfNecessary() {    
  2.   // HTTP connection reuse which was buggy pre-froyo     
  3.  if (Integer.parseInt(Build.VERSION.SDK) < Build.VERSION_CODES.FROYO) {        System.setProperty("http.keepAlive""false");     
  4.  }  
  5. }  


3) 在Gingerbread中,httpurlconnection會增加對壓縮報文頭的處理,服務端可以用
GZIP,詳細見:
  https://developer.android.com/reference/java/net/HttpURLConnection.html

4) 對HTTPURLCONECTION中,在3。0後以及4。0中都進行了改善,比如對HTTPS的支持,
在4。0中,還增加了對緩存的支持呢!比如下麵的代碼:
[java] view plaincopy
  1. private void enableHttpResponseCache()   
  2. {    
  3.   try {  
  4.         long httpCacheSize = 10 * 1024 * 1024// 10 MiB      
  5.     File httpCacheDir = new File(getCacheDir(), "http");      
  6.     Class.forName("android.net.http.HttpResponseCache").getMethod("install", File.classlong.class.invoke(null, httpCacheDir, httpCacheSize);     
  7.  }   
  8. catch   
  9. (Exception httpResponseCacheNotAvailable) {    
  10.   }  
  11. }  

  穀歌的的建議是,Gingerbread後的版本,都建議用httpurlconnection,獲得更高的性能

5)在android SDk中httpclient使用的是4.0beta2,我不得不說這個版本裏麵有些蛋疼的bug:

I.auth caching;

II.在4.0上的sdk,將wifi和3g同時打開,理論上來說,網絡接口應該走wifi,但是卻走了代理,導致訪問服務器網絡失敗;

解決上麵問題的唯一辦法就是引入“https://code.google.com/p/httpclientandroidlib/”中的庫,然後修改相應的類,典型的例子就是ThreadSafeClientConnManager變成了PoolingClientConnectionManager

個人意見:

我對穀歌官方開發同事的意見有點不敢雷同,個人更傾向於使用httpclient,因為從PoolingClientConnectionManager得解釋我們就可以知道:

Manages a pool of {@link OperatedClientConnection client connections} and is able to service connection requests from multiple execution threads.
Connections are pooled on a per route basis. A request for a route which already the manager has persistent connections for available in the pool will be services by leasing a connection from the pool rather than creating a brand new connection.

可以節省我們頻繁建立連接的時間,往往在我們的app裏麵更多的情況是,不斷的去下拉列表調用接口,反複創建連接的代價可想而知。

請注意關注我後麵的文章,我會對apache的httpclient 4.2版本的架構做全麵地分析。


最後更新:2017-04-04 07:03:48

  上一篇:go Oracle中的文件的執行命令
  下一篇:go tc SRM 570 div2 1000 CentaurCompanyDiv2