2012-01-06 3 views
2

Android実装でmaybeCreateHttpClient()をいくつか見てきました。特にGoogleのサンプルでは、​​HttpClientオブジェクトがインスタンス化されていないかどうかを確認してインスタンス化して再利用するかどうかを確認します。HttpClientを高価にしていますか?

なぜこのアプローチですか?高価な新しいHttpClientを作成していますか?

+2

。クッキージャーとそのようなもの。 – Thilo

+0

良い点@Thilo。何らかの認証を実行する場合は、同じhttpclientを保持する必要があります。そうしないと、後続の呼び出しごとに資格情報が渡されません。 – Damian

答えて

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

+0

一度に実行できる並行性要求の数を設定できます.JavaScriptのThreadSafeClientConnManagerを確認してください。プールにスロットがなくなると、さらにリクエストがブロックされます。 –

0

HttpClientは、かなり大きく複雑なオブジェクトです。あなたのアプリで何十(または多分)httpコールを行うかもしれません。 httpリクエストごとに新しいものを作成した場合、すぐにメモリの問題が発生し、ガベージコレクションの速度が低下することに気付くはずです。

httpクライアントは、httpコールを行い、再使用するのに役立つ一般的なコンポーネントです。理由もありません。

+0

しかし、それを再利用すると、「SingleClientConnManagerの無効な使用:接続はまだ割り当てられています」が発生することがあります。どんな良いデザインパターン? – VHanded

関連する問題