안드로이드, HttpResponseCache Open Source Library |
참조 : https://developer.android.com/reference/android/net/http/HttpResponseCache.html
ICS 부터 지원하는 녀석.
HTTP 와 HTTPS response 를 filesystem 에 cache 하여 시간과 bandwidth 를 절약한다.
HttpURLConnection 과 HttpsURLConnection 을 지원하고,
DefaultHttpClient 또는 AndroidHttpClient 는 지원하지 않는다.
Cache 설치하기
다음 코드는 10메가 Cache 를 만든다.
protected void onCreate(Bundle savedInstanceState) {
...
try {
File httpCacheDir = new File(context.getCacheDir(), "http");
long httpCacheSize = 10 * 1024 * 1024; // 10 MiB
HttpResponseCache.install(httpCacheDir, httpCacheSize);
catch (IOException e) {
Log.i(TAG, "HTTP response cache installation failed:" + e);
}
}
protected void onStop() {
...
HttpResponseCache cache = HttpResponseCache.getInstalled();
if (cache != null) {
cache.flush();
}
}
}
File Size 와 Hitrate 의 상관관계를 조정하여 사이즈를 정해야 한다.
External 에 File 저장을 할 수도 있지만 권장되지는 않는다. ( getExternalCacheDir() )
Cache Optimization
Cache 가 효율적인지 보기 위해서 3가지 통계를 제공한다.
1. Request Count : cache 가 만들어진 후 http request 수
2. Network Count : network 를 사용한 request 횟수
3. Hit Count : cahce 에 의해 처리된 request 횟수
Network Response 강제시키기
유저가 "refresh" button 을 누르던가 하면 cache 를 거치지 않고 server 의 내용을 가져와야 한다. 이를 위해서는 no-cache 를 적용한다.
connection.addRequestProperty("Cache-Control", "no-cache");
server 를 통해 validation 을 한 후 (if-not-modified) network 혹은 cache 사용을 정하고 싶다면 다음과 같이 max-age="0" 을 넣어준다.
connection.addRequestProperty("Cache-Control", "max-age=0");
Cache Response 강제시키기
Cache 된 내용이 있다면 cache 의 것을 쓰고, 그렇지 않다면 아무 행동도 하지 않게 하기 위해서는 only-if-cached 를 사용한다.
try {
connection.addRequestProperty("Cache-Control", "only-if-cached");
InputStream cached = connection.getInputStream();
// the resource was cached! show it
catch (FileNotFoundException e) {
// the resource was not cached
}
}
Stle response 가 기간대비하여 valid 할 경우 사용한다.
int maxStale = 60 * 60 * 24 * 28; // tolerate 4-weeks stale
connection.addRequestProperty("Cache-Control", "max-stale=" + maxStale);
ICS 이전 버전 backward compatibility.
ICS 이전에는 다음과 같이 체크한 후 사용한다.
try {
File httpCacheDir = new File(context.getCacheDir(), "http");
long httpCacheSize = 10 * 1024 * 1024; // 10 MiB
Class.forName("android.net.http.HttpResponseCache")
.getMethod("install", File.class, long.class)
.invoke(null, httpCacheDir, httpCacheSize);
catch (Exception httpResponseCacheNotAvailable) {
}
}
혹은 다음 library 를 사용해도 된다.
https://github.com/candrews/HttpResponseCache
final long httpCacheSize = 10 * 1024 * 1024; // 10 MiB
final File httpCacheDir = new File(getCacheDir(), "http");
try {
Class.forName("android.net.http.HttpResponseCache")
.getMethod("install", File.class, long.class)
.invoke(null, httpCacheDir, httpCacheSize);
} catch (Exception httpResponseCacheNotAvailable) {
Ln.d(httpResponseCacheNotAvailable, "android.net.http.HttpResponseCache not available, probably because we're running on a pre-ICS version of Android. Using com.integralblue.httpresponsecache.HttpHttpResponseCache.");
try{
com.integralblue.httpresponsecache.HttpResponseCache.install(httpCacheDir, httpCacheSize);
}catch(Exception e){
Ln.e(e, "Failed to set up com.integralblue.httpresponsecache.HttpResponseCache");
}
}
요렇게 쓸 수 있는데, JB 에 있는 bug fix, feture 향상, performance 향상 등을 느끼려면 항상 이 library 를 사둉하는 것이 좋다.
'프로그래밍 놀이터 > 안드로이드, Java' 카테고리의 다른 글
[android] intranet 비슷한 환경 구축하기. (0) | 2013.07.23 |
---|---|
[android] Webview font에 대한 실험결과 (0) | 2013.07.20 |
[android] Webview 에 custom font 적용하기 (8) | 2013.07.18 |
[android] TextureView 에 대한 이야기 (0) | 2013.07.18 |
[android] Strict Mode 에 대해 알아보자. (0) | 2013.07.17 |
댓글