Picassoでオリジナルの画像をキャッシュする

More than 1 year has passed since last update.


  • Picassoのキャッシュはリサイズ後の画像サイズとscaleTypeごとに個別にキャッシュされる

// 一回目の読み込み

Picasso.with(context).load(url).resize(100, 100).centerCrop().into(imageView)

// これはキャッシュが効く
Picasso.with(context).load(url).resize(100, 100).centerCrop().into(imageView)

// これはサイズが違うので、キャッシュが効かない
Picasso.with(context).load(url).resize(500, 500).centerCrop().into(imageView)


  • でも、これだと都合が悪い時がある。一覧画面から詳細画面に遷移するようなときに、一覧画面では100x100で画像を表示するが詳細画面では500x500で表示したい場合、オリジナルの画像がキャッシュされてないと通信が発生してしまう。

  • こんな場合は、Picassoのキャッシュではなく、その下層のOkHttpのキャッシュを有効にする

int cacheSize = 10 * 1024 * 1024; // 10 MiB

Cache cache = new Cache(cacheDirectory, cacheSize);
client = new OkHttpClient.Builder()
.cache(cache)
.build();


  • OkHttpのキャッシュが有効になるかどうかは、リクエストとレスポンスのヘッダーによる。



    • OkHttpのwikiには、max-stalemax-ageだけ書いてあるが、他にもdateageなども影響しそう。詳しくはCacheStrategyのソースを読むしかない。