我在Android中實現了一些例子maybeCreateHttpClient(),特別是在Google樣例中,它的作用是檢查HttpClient對象是否實例化,如果沒有,實例化它並重用它。正在創建HttpClient昂貴嗎?
爲什麼採用這種方法?正在創造新的HttpClient昂貴?
我在Android中實現了一些例子maybeCreateHttpClient(),特別是在Google樣例中,它的作用是檢查HttpClient對象是否實例化,如果沒有,實例化它並重用它。正在創建HttpClient昂貴嗎?
爲什麼採用這種方法?正在創造新的HttpClient昂貴?
使用連接池(例如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));
那麼這是不是意味着,隨後的httpclient調用將被放入隊列中,直到之前完成? – VHanded 2012-01-07 13:39:47
您可以設置一次可以觸發多少個併發請求,請檢查ThreadSafeClientConnManager的javadoc。如果池中沒有更多的插槽,則進一步的請求將被阻止。 – 2012-01-10 07:02:34
HttpClient是相當大且複雜的對象。您可能會在您的應用中進行數十次(或可能更多)的http調用。如果你爲每個http請求創建一個新的請求,你會很快遇到內存問題,並且肯定會注意到垃圾收集速度下降。
http客戶端是一個通用組件,可以幫助您進行http調用,只是重用它。沒有理由不是。
但重用它有時會導致「SingleClientConnManager的無效使用:連接仍然分配。」任何好的設計模式? – VHanded 2012-01-06 10:03:25
我不知道昂貴,但它可以是有狀態。 Cookie罐和類似的東西。 – Thilo 2012-01-06 09:54:09
好點@Thilo。如果您執行某種認證,則需要保留相同的httpclient,否則您的憑證將不會傳遞給每個後續呼叫。 – Damian 2012-01-06 09:58:02