Android でインターネットの画像をキャッシュする
Android アプリを作っていると、インターネットから画像を取得して利用することがよくありますが、
それをローカルにキャッシュするにはどうすればいいでしょう、という話を書きます。
ネットからのダウンロードはバックグラウンド・スレッドでやらないと(3.0 以降で)落ちるので、AsyncTask みたいにして doInBackground でダウンロードするとだいたいこんな風になるでしょうか (mUrl というインスタンス変数に画像の URL が入ってる)。
@Override
protected Bitmap doInBackground(Void... params) {
try {
URL url = new URL(mUrl);
URLConnection connection = url.openConnection();
connection.setUseCaches(true); // ここが大切
return BitmapFactory.decodeStream(connection.getInputStream());
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
途中の強調表示したところがポイントです。Java 標準でキャッシュする機能があるとか知らなかった。
実はこれだけでは動かなくて、どのようにキャッシュするのか自分で実装しないと駄目です。ResponseCache というクラスを継承して作ります。こんな感じです。
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;…