일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 | 31 |
- play 강좌
- Hyperledger fabric gossip protocol
- 블록체인
- 파이썬 데이터분석
- hyperledger fabric
- 스칼라 강좌
- 이더리움
- 파이썬 강좌
- 파이썬 머신러닝
- play2 강좌
- Adapter 패턴
- 파이썬 동시성
- 하이브리드앱
- Akka
- 플레이프레임워크
- akka 강좌
- Actor
- 스칼라
- 안드로이드 웹뷰
- 스칼라 동시성
- CORDA
- 주키퍼
- Play2 로 웹 개발
- 하이퍼레저 패브릭
- 엔터프라이즈 블록체인
- 스위프트
- 그라파나
- 파이썬
- Golang
- Play2
- Today
- Total
HAMA 블로그
안드로이드의 HTTP Client 선택 - (번역) 본문
네트워크를 사용하는 대부분의 안드로이드 앱은 HTTP 을 사용해서 데이터를 주고 받는다.
안드로이드는 두가지 HTTP 클라이언트 클래스를 가지고있는데, HttpURLConnection 과 Apache HTTP Client 이다.
둘다 HTTPS 를 지원하며, 스트리밍 업로드, 다운로드 와 타임아웃 설정 , IPv6 및 커넥션 풀링등을 지원한다.
Apache HTTP Client
DefaultHttpClient 와 그것의 형제인 AndroidHttpClient 는 웹 브라우저에 맞춰진 HTTP 클라이언트 확장이다. 다양하고 유연
한 API 들을 가지고있는데 안정되고 거의 버그가 없다. 그러나 그런 커다란 API 사이즈는 하위호환성을 깨지 않고 개선 시키기
가 어려우며 안드로이드 팀은 그것을 적극적으로 사용하지 않는다.
HttpURLConnection
HttpURLConnection 는 대부분의 어플리케이션에 적합한 일반적인 목적의 가벼운 HTTP 클라이언트이다. 이 클래스는 조금
기초적인 기반을 가지고있지만, 안정적으로 향상시킬수있기 쉽게 되어있다. 프로요 버전 이전에 HttpURLConnection 은 약간의
버그를 가지고있었다. 특히 readable InputStream 에서 close() 를 부르는것은 커넥션 풀을 맛가게 할수 있었다.
private void disableConnectionReuseIfNecessary() {
// HTTP connection reuse which was buggy pre-froyo
if (Integer.parseInt(Build.VERSION.SDK) < Build.VERSION_CODES.FROYO) {
System.setProperty("http.keepAlive", "false"); // HTTP 커넥션 재사용은 HTTP 의 KeepAlive 옵션의 역할
}
}
KeepAlive 란? http://brad2014.tistory.com/341
진저브레드 버전에서는 transparent response compression 를 추가했다. HttpURLConnection 는 자동적으로 이 헤더를 요청
에 추가하고 돌아오는 응답을 핸들링할것이다.
Accept-Encoding: gzip
만약 응답 압축이 문제가 있을때 class documentation 를 보면 어떻게 비활성화 시킬수있는지 나와있다.
HTTP 의 Content-Length 헤더는 압축된 사이즈를 돌려주기 때문에 비 압축 데이터의 버퍼 크기를 그것으로 잡으면 에러가 생길
수 있다. 대신해서 InputStream.read() 이 -1 을 리턴할때까지 읽어야한다.
우리는 또한 진저브레드 버전에서 여러가지 HTTPS 향상을 이루어냈는데 HttpsURLConnection 는 SNI(Server Name
Indication) 을 가지고 접속 시도를 한다. 그것은 IP 주소를 공유하기위해 multiple HTTPS 호스트를 허용한다. 또한 세션 티켓들
과 압축을 활성화 할수있다. 커넥션 실패일때 자동적으로 재시도한다. 이것은 오래된것에 대한 호환성을 깨지 않고 최신의 서버
에 접속할때 HttpsURLConnection 를 효율적이게 만든다.
아이스크림 샌드위치에서 응답캐쉬를 추가했고, HTTP 요청은 3가지방법중 하나로 이루어진다.
- 완전한 캐쉬 응답은 로컬 스토리지로부터 직접적으로 서비스된다.
- 상황에 따라서 캐쉬된 응답은 최신의 것이라는것이 웹서버에 의해 검증된다. 클라이언트는 “Give me /foo.png if it changed
since yesterday” 같은 요청을 보내며 , 서버는 업데이트된 내용을 보내주거나 304 Not Modified 상태를 보내준다.."컨텐츠
가 그대로니깐 다운로드될 필요없다라는~"
- 캐쉬되지 않은 응답은 웹으로부터 서비스되며 이 응답은 후에 응답캐쉬에 저장될것이다.
리플렉션을 사용하여 디바이스상에 HTTP 응답캐쉬를 활성화하는 샘플. 이 샘플은 이전 버전에는 영향없이 아이스크림 샌드위치
버전부터 응답캐쉬를 작동시킨다.
private void enableHttpResponseCache() {
try {
long httpCacheSize = 10 * 1024 * 1024; // 10 MiB
File httpCacheDir = new File(getCacheDir(), "http");
Class.forName("android.net.http.HttpResponseCache").getMethod("install", File.class, long.class)
.invoke(null, httpCacheDir, httpCacheSize);
} catch (Exception httpResponseCacheNotAvailable) {
}
}
* HTTP 응답상의 케쉬헤더를 세팅하기위해 웹서버를 설정해야한다.
그래서 뭐가 좋은건데?
apache HTTP client 는 Eclair and Froyo 에서 아주 작은 버그를 가지고있고 저 버전을 사용할땐 베스트이다.
진저브레드에서는 HttpURLConnection 가 베스트이다. 그것의 단순함과 작은 사이즈는 안드로이드에 딱이다.
Transparent comppression 과 응답캐싱은 네트워크 부하를 줄이고 속도를 향상시키며 베터리에도 좋다.
새로운 어플리케이션은 HttpURLConnection 로 하자.
'안드로이드' 카테고리의 다른 글
[안드로이드 웹뷰] 네비게이션 핸들링 (0) | 2015.08.21 |
---|---|
안드로이드 제목바(타이틀바) 없애기 (0) | 2015.07.31 |
안드로이드에서 서비스 와 쓰레드의 차이 (0) | 2015.06.30 |
안드로이드 와이파이 다이렉트(WI-FI Direct) 프로그래밍(3-1) (0) | 2015.06.21 |
안드로이드 와이파이 다이렉트(WI-FI Direct) 프로그래밍(2-1) (0) | 2015.06.21 |