본문 바로가기
프로그래밍 놀이터/안드로이드, Java

[android] HttpResponseCache library

by 돼지왕 왕돼지 2013. 7. 20.
반응형


 안드로이드, HttpResponseCache Open Source Library

 


안드로이드, 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 를 사둉하는 것이 좋다.



반응형

댓글