Picassoでキャッシュの簡単設定


要約

picassoのcacheの設定をいじってみた

Picassoのキャッシュとは

picassoは一時的・ある一定の期間画像をキャッシュに保管しておくことができる。

Picassoのメモリキャッシュ

  • メモリの中の external storage の部分

    external storageはメモリの中の共通部分に当てはまる。

Picassoのディスクキャッシュ

  • メモリの中の external storage の部分

    internal storageはメモリの中の特定のアプリケーションのディレクトリの中に設けられた cache/ディレクトリ。
    cache/ディレクトリの中を見てみるとpicasso-cacheの領域が確保されていた。

基本設定

Downloaderも設定することができる

app.gradle
compile 'com.squareup.picasso:picasso:2.5.2'
compile 'com.squareup.okhttp:okhttp:2.4.0'
MainApplication
public class MainApplication extends Application implements Application.ActivityLifecycleCallbacks {

private final static SET_MAX_DISC_CACHE_SIZE;//ここにcacheのmaxサイズを設定することができる

    @Override
    public void onCreate() {
        //set cache and downloader to Picasso
        Picasso.Builder builder = new Picasso.Builder(this);
        builder.downloader(new OkHttpDownloader(this, Integer.MAX_VALUE));
        FincLruCache fincLruCache = new FincLruCache(SET_MAX_DISC_CACHE_SIZE);
        Picasso built = builder.memoryCache(fincLruCache).build();
        built.setIndicatorsEnabled(true);
        built.setLoggingEnabled(true);
        Picasso.setSingletonInstance(built);
    }
}

画像をロードする時の設定

MemoryPolicy

  • MemoryPolicy.NO_CACHE
    memory cacheから探さないようにする

  • MemoryPolicy.NO_STORE
    ロードしたimageをmemory cacheに入れないようにする

NetworkPolicy

  • NetworkPolicy.NO_STORE
    disk cache に保存するのを避けるようにする
  • NetworkPolicy.OFFLINE

    disk cacheのみから探すようにする

DiskCacheに保存されるのを防ぎたいとき

Picasso.with(getActivity())
.load(imageUrl)
.networkPolicy(NetworkPolicy.NO_STORE)
.into(imageView)

Cacheから探したい時

-> なかった時にnetworkから探すようにする

Picasso.with(getActivity())
.load(imageUrl)
.setworkPolicy(NetworkPolicy.OFFLINE)
.into(imageView, new Callback() {
    @Override
    public void onSuccess() {

    }

    @Override
    public void onError() {
        //Try again online if cache failed
        Picasso.with(getActivity())
                .load(imageUrl)
                .error(R.drawable.image)
         //エラー時の画像
                .placeholder(R.drawable.image)
                //読み込み時の画像
                .into(imageView, new Callback() {
            @Override
            public void onSuccess() {

            }
             @Override
            public void onError() {
                //エラー処理
            }
        });
    }
});

問題点など

  • キャッシュはpicassoが用意している LruCacheクラスを利用する。しかし、LRU(least recently used)で実装されているため、例えば特定のファイルなどを永続的に保存しておきたいなどということには使うことができない。
  • 簡単に実装はできるがカスタマイズはしにくいので、これ以上のことを求めるとすればGlideなどを使うと良いかもしれない。