Picassoを使用してディスクから画像を読み込みPicasso.with(ctx).load(new File("/path/to/image")).into(imageView)
ますが、そのファイルに新しい画像を保存して を更新するとImageView
、Picasso にはまだビットマップがキャッシュされています。
Picasso でキャッシュを無効にすることは可能ですか?
Picassoを使用してディスクから画像を読み込みPicasso.with(ctx).load(new File("/path/to/image")).into(imageView)
ますが、そのファイルに新しい画像を保存して を更新するとImageView
、Picasso にはまだビットマップがキャッシュされています。
Picasso でキャッシュを無効にすることは可能ですか?
Picasso の最近のバージョンでは、無効化のための新しいメソッドがあり、回避策がないため、前述のカスタム PicassoTools クラスはこの場合は廃止されたと思います。
Picasso.with(getActivity()).invalidate(file);
使用してみてください:
Picasso.with(ctx).load(new File("/path/to/image")).skipMemoryCache().into(imageView)
Picasso で画像を検索する順序は、メモリ キャッシュ -> ディスク キャッシュ -> ネットワークです。
そのため、Picasso でキャッシュを無効にする必要があるシナリオはほとんどありません。
1.メモリ キャッシュを無効にします。
解決策: Url、File、Uri のキャッシュが存在する場合はクリアします
mPicasso.with(appContext).invalidate(File);
mPicasso.with(appContext).invalidate(Url);
mPicasso.with(appContext).invalidate(Uri);
.
2.オンラインでメモリキャッシュとディスクキャッシュを無効化
※注:オンラインとは、ImageView に直接更新することを意味します
ユーザー ケース: リモート ホストで更新されたイメージ
解決策: メモリ キャッシュとディスク キャッシュ上のイメージを中止し、リモート ホスト上のイメージを要求します。
mPicasso.with(appContext)
.load(url)
.memoryPolicy(MemoryPolicy.NO_CACHE )
.networkPolicy(NetworkPolicy.NO_CACHE)
.into(imageView);
-> メモリキャッシュとディスクキャッシュを中止
.
3.メモリキャッシュとディスクキャッシュを無効化 Offline
※注:オフライン更新とは、ImageView への更新ではなく、後で使用するためのバックグラウンド フェッチのみを意味します
解決策: フェッチのみ
mPicasso.with(appContext)
.load(url)
.memoryPolicy(MemoryPolicy.NO_CACHE)
.networkPolicy(NetworkPolicy.NO_CACHE)
.fetch();
※注: fetch() を使用するのは良いことですが、ネットワーク リソースも消費するため、慎重に検討してください。より良い解決策については、以下のシナリオ 4 を確認してください。
4.メモリキャッシュとディスクキャッシュを無効 にする ディスクキャッシュが存在する場合はOffline
解決策: パラメータを使用してディスクをチェックする必要があります: NetworkPolicy.OFFLINE cache before fetch
mPicasso.with(appContext)
.load(url)
.memoryPolicy(MemoryPolicy.NO_CACHE)
.networkPolicy(NetworkPolicy.OFFLINE)
.fetch(new Callback() {
@Override
public void onSuccess() {
//Success: mean disk cache exist -> should do actual fetch
picasso.load(url).fetch();
}
@Override
public void onError() {
//Failed: mean disk cache not exist
}
});
Picasso は素晴らしいライブラリです。今後、squareup がキャッシュを管理するための便利な API を追加することを願っています。
すべてのキャッシュを一度に削除したい場合にできることは、カスタムを作成してから、そのメソッドをPicasso.LruCache
使用することです。clear
以下にサンプルを示します。
Picasso.Builder builder = new Picasso.Builder(this);
LruCache picassoCache = new LruCache(this);
builder.memoryCache(picassoCache);
Picasso.setSingletonInstance(builder.build());
キャッシュをクリアするには:
picassoCache.clear();
別のオプションは、たとえばアプリの起動時に、キャッシュ ディレクトリ自体を削除することです。
deleteDirectoryTree(context.getCacheDir());
どこ:
/**
* Deletes a directory tree recursively.
*/
public static void deleteDirectoryTree(File fileOrDirectory) {
if (fileOrDirectory.isDirectory()) {
for (File child : fileOrDirectory.listFiles()) {
deleteDirectoryTree(child);
}
}
fileOrDirectory.delete();
}
これにより、キャッシュ ディレクトリ全体が削除されます。これは、アプリの初回使用をシミュレートする場合に適しています。Picasso キャッシュのみを削除する場合は、「picasso-cache」をパスに追加します。
独自のキャッシュを設定してクリアすることで、ピカソの画像キャッシュをクリアできます。このコードは Picasso 2.5.0 でテストされました
private Picasso picasso;
private LruCache picassoLruCache;
picassoLruCache = new LruCache(context);
// Set cache
picasso = new Picasso.Builder(context) //
.memoryCache(picassoLruCache) //
.build();
// Clear cache
picassoLruCache.clear();
きれいにループしませんが、このアプローチにより、キャッシュとピカソに関する問題が修正されました。特定の URL のキャッシュを無効にする場合にのみ、これを使用してください。このアプローチは遅く、おそらく正しい方法ではありませんが、私にとってはうまくいきます。
String url = "http://www.blablabla.com/Raiders.jpg";
Picasso.with(this).invalidate(url);
Picasso.with(this)
.load(url)
.networkPolicy(
NetworkUtils.isConnected(this) ?
NetworkPolicy.NO_CACHE : NetworkPolicy.OFFLINE)
.resize(200, 200)
.centerCrop()
.placeholder(R.mipmap.ic_avatar)
.error(R.mipmap.ic_avatar)
.into(imageView);
代わりに使用shutdown()
ソース コードに従って。シャットダウンは、それ以上のリクエストの受け入れを停止し、すべてのキャッシュをクリアします
/** Stops this instance from accepting further requests. */
public void shutdown() {
if (this == singleton) {
throw new UnsupportedOperationException("Default singleton instance cannot be shutdown.");
}
if (shutdown) {
return;
}
cache.clear();
cleanupThread.shutdown();
stats.shutdown();
dispatcher.shutdown();
for (DeferredRequestCreator deferredRequestCreator : targetToDeferredRequestCreator.values()) {
deferredRequestCreator.cancel();
}
targetToDeferredRequestCreator.clear();
shutdown = true;
}
また、シングルトン インスタンスをシャットダウンすることもできません。したがって、のインスタンス変数が必要ですPicasso
。picasso インスタンスshutdown()
を再利用するために毎回再初期化することを忘れないでください。
もう 1 つのオプションは、新しいイメージを元のイメージとは別のファイルに保存することです。Picasso ビットマップ キャッシュはファイル パスからキーオフされるため、別のファイルから新しい画像をロードすると、キャッシュ ミスが発生します。これには、キャッシュ全体をクリアする必要がないという副次的な利点もあります。
File f = new File(path, name);
Picasso.with(this).invalidate(Uri.fromFile(f));