2012-01-06 6 views
2

Android에서 maybeCreateHttpClient()를 구현 한 몇 가지 예를 보았습니다. 특히 Google 샘플에서는 HttpClient 객체가 인스턴스화되었는지 확인하고, 인스턴스화하지 않고 인스턴스화 한 다음 다시 사용하는지 여부를 확인합니다.HttpClient를 비싸게 만들고 있습니까?

왜 이러한 접근 방식입니까? 새로운 HttpClient를 비싸게 만들고 있습니까?

+2

I 비싼 모르는를하지만 상태가 될 수 있습니다. 쿠키 항아리와 그런 것들. – 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

그래서 이전에 끝날 때까지 다음 HTTP 클라이언트 호출이 대기열에 저장됩니다. – VHanded

+0

한 번에 실행할 수있는 동시성 요청 수를 설정할 수 있습니다. ThreadSafeClientConnManager의 javadoc을 확인하십시오. 풀에 슬롯이 더 이상 없으면 추가 요청이 차단됩니다. –

0

HttpClient는 상당히 크고 복잡한 개체입니다. 앱에서 수십 (또는 더 많은) http 전화를 걸 수 있습니다. 각 HTTP 요청에 대해 새로운 HTTP 요청을 만들면 메모리 문제가 발생하여 가비지 수집 속도가 느려지 게됩니다.

http 클라이언트는 http 호출을하고 재사용하는 데 도움이되는 일반적인 구성 요소입니다. 너무 이유가 없습니다.

+0

하지만 재사용하면 "때때로 SingleClientConnManager의 잘못된 사용 : 연결이 여전히 할당되었습니다."가 발생할 수 있습니다. 어떤 좋은 디자인 패턴? – VHanded

관련 문제