Programming Style

メニュー

初心者がアプリ開発者になるためのプログラミング学習サイト

[Android] HttpResponseCache:HTTPレスポンスをキャッシュする

android-common-top

HttpResponseCacheを使うとHttpURLConnectとHttpsURLConnectionを使ったHTTP、HTTPS通信の応答をキャッシュすることができます。ここでは、HttpResponseCacheの使い方について説明します。

 

広 告

 

目次

前提条件

  • 特になし

動作確認端末

  • Google Nexus 7 – 5.1.1 – API22(実機)

1. HTTPレスポンスキャッシュをインストールする

 

HttpResponseCacheを使うとHttpURLConnectHttpsURLConnectionを使ったHTTP、HTTPS通信の応答をキャッシュすることができます。

 

Note : DefaultHttpClientAndroidHttpClientを使った通信についてはキャッシュすることはできません。

 

アプリの起動時にHTTPレスポンスキャッシュをインストールすることで、アプリすべてのHTTP通信に対するキャッシュが有効になります。

 

キャッシュをインストールするためには、以下のコードを実行します。

 

HTTPレスポンスキャッシュをインストールする

try {
    final File cacheDir = new File(context.getCacheDir(), "http");
    // キャッシュサイズは10MBで設定
    final long cacheSize = 10 * 1024 * 1024; 
    HttpResponseCache.install(cacheDir, cacheSize);
} catch (IOException e) {
    Log.e(getClass().getSimpleName(), "HTTP response cache installation failed : " + e);
}

 

 

 

 

 

2. HTTPレスポンスキャッシュをクリアする

 

HTTPレスポンスキャッシュをクリアするためには、以下のコードを実行します。

 

HTTPレスポンスをキャッシュする

final HttpResponseCache cache = HttpResponseCache.getInstalled();
if (cache != null) {
    cache.flush();
}

 

 

 

3. キャッシュを明示的に利用しない

 

ユーザがアプリ内の更新ボタン押した時など、キャッシュを利用せず、サーバから最新のリソースを取得したい場合があります。その場合は、以下のようにHTTPリクエストのヘッダの"Cache-Control""no-cache"を設定することが実現することができます。

 

キャッシュを明示的に利用しない

final URL url = new URL("http://xxxxxxxxxx/xxxxxx/");
final HttpURLConnection con = (HttpURLConnection) url.openConnection();
con.addRequestProperty("Cache-Control", "no-cache");

 

サーバによって検証された応答のみをキャッシュを利用せず取得する場合は、以下のように"max-age=0"を使用した方が効果的です。

 

キャッシュを明示的に利用しない

final URL url = new URL("http://xxxxxxxxxx/xxxxxx/");
final HttpURLConnection con = (HttpURLConnection) url.openConnection();
con.addRequestProperty("Cache-Control", "max-age=0");

 

 

 

4. キャッシュを強制的に利用する

 

アプリ要件として「すぐに利用可能な画像などのリソースをすぐに表示しつつ、バックグランドでは最新のリソースを表示したい」などがあるかと思います。利用可能なリソースをすぐに表示するためには、キャッシュを強制的に利用します。以下のように、HTTPリクエストのヘッダの"Cache-Control""only-if-cached"を設定することで、強制的にキャッシュを利用することができます。

 

キャッシュを強制的に利用する

try {
    final URL url = new URL("http://xxxxxxxxxx/xxxxxx/");
    final HttpURLConnection con = (HttpURLConnection) url.openConnection();
    con.addRequestProperty("Cache-Control", "only-if-cached");
    // キャッシュされたデータのストリームを取得
    final InputStream cached = connection.getInputStream();
    ...
} catch (FileNotFoundException e) {
    // キャッシュされなかった
}

 

 

 

5. Android4.0以前のバージョンでキャッシュをインストールする

 

HttpResponseCacheはAndroid 4.0 (Ice Cream Sandwich)から追加されたクラスです。もしAndroid4.0以前の端末でキャッシュをインストールするためには、以下のようにリフレクションを利用します。

 

Android4.0以前のバージョンでキャッシュをインストールする

try {
    final File cacheDir = new File(context.getCacheDir(), "http");
    final long cacheSize = 10 * 1024 * 1024;
    Class.forName("android.net.http.HttpResponseCache")
            .getMethod("install", File.class, long.class)
            .invoke(null, cacheDir, cacheSize);
} catch (Exception e) {
}

 

 

 

6. 参考URL

 

HttpResponseCache | Android Developers

http://developer.android.com/intl/ja/reference/android/net/http/HttpResponseCache.html

 

 

 

 

 

広 告

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です