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

HttpResponseCacheを使うとHttpURLConnectとHttpsURLConnectionを使ったHTTP、HTTPS通信の応答をキャッシュすることができます。ここでは、HttpResponseCacheの使い方について説明します。
広 告
目次
- 1. HTTPレスポンスキャッシュをインストールする
- 2. HTTPレスポンスキャッシュをクリアする
- 3. キャッシュを明示的に利用しない
- 4. キャッシュを強制的に利用する
- 5. Android4.0以前のバージョンでキャッシュをインストールする
- 6. 参考URL
前提条件
- 特になし
動作確認端末
- Google Nexus 7 – 5.1.1 – API22(実機)
1. HTTPレスポンスキャッシュをインストールする
HttpResponseCacheを使うとHttpURLConnectとHttpsURLConnectionを使ったHTTP、HTTPS通信の応答をキャッシュすることができます。
DefaultHttpClient
やAndroidHttpClient
を使った通信についてはキャッシュすることはできません。
アプリの起動時に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