##要約
picassoのcacheの設定をいじってみた
##Picassoのキャッシュとは
picassoは一時的・ある一定の期間画像をキャッシュに保管しておくことができる。
###Picassoのメモリキャッシュ
-
メモリの中の
external storage
の部分external storage
はメモリの中の共通部分に当てはまる。
###Picassoのディスクキャッシュ
-
メモリの中の
external storage
の部分internal storage
はメモリの中の特定のアプリケーションのディレクトリの中に設けられたcache/
ディレクトリ。
cache/
ディレクトリの中を見てみるとpicasso-cache
の領域が確保されていた。
##基本設定
Downloaderも設定することができる
compile 'com.squareup.picasso:picasso:2.5.2'
compile 'com.squareup.okhttp:okhttp:2.4.0'
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などを使うと良いかもしれない。