JavaでHttpClientを使用して複数のスレッドでURLのコンテンツを取得する正しい方法は何ですか?
たとえば、アイテムを含むリストをロードし、各アイテムを異なるスレッドに同時にロードし、異なるパラメータを使用して同じURLから情報を取得します。
私が作成しているアプリケーションでは、異なるスレッドで同じURLからXMLを読み取るときに、要素が見つからないという例外が発生しません。
JavaでHttpClientを使用して複数のスレッドでURLのコンテンツを取得する正しい方法は何ですか?
たとえば、アイテムを含むリストをロードし、各アイテムを異なるスレッドに同時にロードし、異なるパラメータを使用して同じURLから情報を取得します。
私が作成しているアプリケーションでは、異なるスレッドで同じURLからXMLを読み取るときに、要素が見つからないという例外が発生しません。
受け入れられた回答はHttpClient3.xのみの解決策であり、現在のバージョンは4.1(これはAndroidにも含まれています)であるため、動作する4.xの例を共有したいと思います。多分それは誰かの喧噪を救うでしょう。
SchemeRegistry schemeRegistry = new SchemeRegistry();
schemeRegistry.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80));
schemeRegistry.register(new Scheme("https", SSLSocketFactory.getSocketFactory(), 443));
HttpParams parameters = new BasicHttpParams();
ClientConnectionManager connectionManager = new ThreadSafeClientConnManager(parameters, schemeRegistry);
HttpClient httpClient = new DefaultHttpClient(connectionManager, parameters);
HttpClient3.0を使用していると思います。これを試して、
HttpClient client = new HttpClient(new MultiThreadedHttpConnectionManager());
ThreadSafeClientConnManager
4.2でも説明されています。使用する代わりにorg.apache.http.impl.conn.PoolingHttpClientConnectionManager
データをアプリケーションスコープに配置すると、どのスレッドからでも利用できるようになります。データが機密である場合はこれを使用しないでください。削除しないとサーバーの存続期間中に存在するため、データを使い終わったら明示的に削除することを忘れないでください。