2012-01-06 79 views
2

我在Android中實現了一些例子maybeCreateHttpClient(),特別是在Google樣例中,它的作用是檢查HttpClient對象是否實例化,如果沒有,實例化它並重用它。正在創建HttpClient昂貴嗎?

爲什麼採用這種方法?正在創造新的HttpClient昂貴?

+2

我不知道昂貴,但它可以是有狀態。 Cookie罐和類似的東西。 – Thilo 2012-01-06 09:54:09

+0

好點@Thilo。如果您執行某種認證,則需要保留相同的httpclient,否則您的憑證將不會傳遞給每個後續呼叫。 – Damian 2012-01-06 09:58:02

回答

3

使用連接池(例如ThreadSafeClientConnManager)來管理客戶端。

HttpParams params = new BasicHttpParams(); 
HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1); 
HttpProtocolParams.setContentCharset(params, HTTP.DEFAULT_CONTENT_CHARSET); 
HttpProtocolParams.setUseExpectContinue(params, true); 

SchemeRegistry registry = new SchemeRegistry(); 
registry.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80)); 
registry.register(new Scheme("https", SSLSocketFactory.getSocketFactory(), 443)); 

ClientConnectionManager connman = new ThreadSafeClientConnManager(params, registry); 
client = new DefaultHttpClient(connman, params); 

客戶端是可以重複使用一個單獨的對象,火的請求:

HttpResponse response = client.execute(new HttpGet(URL)); 
+0

那麼這是不是意味着,隨後的httpclient調用將被放入隊列中,直到之前完成? – VHanded 2012-01-07 13:39:47

+0

您可以設置一次可以觸發多少個併發請求,請檢查ThreadSafeClientConnManager的javadoc。如果池中沒有更多的插槽,則進一步的請求將被阻止。 – 2012-01-10 07:02:34

0

HttpClient是相當大且複雜的對象。您可能會在您的應用中進行數十次(或可能更多)的http調用。如果你爲每個http請求創建一個新的請求,你會很快遇到內存問題,並且肯定會注意到垃圾收集速度下降。

http客戶端是一個通用組件,可以幫助您進行http調用,只是重用它。沒有理由不是。

+0

但重用它有時會導致「SingleClientConnManager的無效使用:連接仍然分配。」任何好的設計模式? – VHanded 2012-01-06 10:03:25

相關問題